我的應用程式中有一個 rake 任務,它應該啟動一個 TCP 服務器。我已將 rake 命令移動到一個entrypoint.sh檔案中,并在 docker-compose 中添加了名為tcp.
當我運行docker-compose up -d. 我嘗試了不同的設定方法,但沒有運氣。如何為 rake 任務構建 docker 映像?
unable to prepare context: path "/Users/mac_user/Projects/fmt100/lib/tasks/socketing.rake" not found
碼頭工人-compose.yml
version: '3.9'
services:
tcp:
build: ./lib/tasks/socketing.rake
depends_on:
- app
- database
- redis
- sidekiq
env_file: .env
volumes:
- .:/app
- tcp_server:/app/lib/tasks
entrypoint: ./entrypoints/tcp-entrypoint.sh
volumes:
tcp_server:
uj5u.com熱心網友回復:
您應該擁有build:包含 Rails 應用程式的相同影像。覆寫command:以運行 Rake 任務。在 Compose 檔案中,它應該大致如下所示:
version: '3.8'
services:
tcp:
build: .
depends_on: [database, redis]
env_file: .env
command: rake socketing
app:
build: .
depends_on: [database, redis]
env_file: .env
ports: ['3000:3000']
database: { ... }
redis: { ... }
sidekiq: { ... }
sidekiq容器可能看起來非常相似。
由于您有兩個標記為 的容器build: .,因此 Compose 將嘗試構建映像兩次。但是,這些映像具有相同的 Dockerfile 并在相同的源樹上運行。這意味著 Docker 的層快取會生效,第二次構建會運行得非常快,實際上不會產生新的鏡像。
要使其正常作業,您還需要正確構建 Dockerfile。重要的是,您將實際命令作為 DockerfileCMD而不是作為 Dockerfile 運行ENTRYPOINT(或者至少它必須與您在 中的覆寫相匹配docker-compose.yml)。與往常一樣,確保影像是獨立的,并包含其所有庫依賴項和應用程式代碼(請注意volumes:上面的 Compose 檔案中沒有)。
FROM ruby:2.7
WORKDIR /app
RUN gem install bundler:2.3.12
COPY Gemfile Gemfile.lock .
RUN bundle install
COPY . .
EXPOSE 3000
# ENTRYPOINT ["./entrypoint.sh"]
CMD rails server -b 0.0.0.0
您不應將該命令放在ENTRYPOINT入口點腳本或入口點腳本中。相反,使用入口點進行一些首次設定,并可能注入相關的包裝器,如 Bundler。
#!/bin/sh
# entrypoint.sh
# Run database migrations, but only if we're running the main server.
if [ "$1" = rails -a "$2" == server ]; then
bundle exec rake db:migrate
fi
# Run whatever command we were given under Bundler.
exec bundle exec "$@"
command:覆寫非常簡單,您提供的任何內容都會出現在腳本"$@"的最終陳述句中。因此,例如,如果您想要一個 Pry 控制臺,您可以
docker-compose run app \
rails console
這將覆寫command:命令列中的 ,使影像ENTRYPOINT保持不變。示例 Compose 檔案對作為 Rake 任務啟動的 TCP 服務器執行相同的操作(同樣,我希望您的 Sidekiq 作業程式以相同的方式作業)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463064.html
標籤:轨道上的红宝石 码头工人 码头工人撰写 耙 码头入口点
下一篇:泊塢窗:“未找到npm”
