我有幾個關于webapp 環境的基本概念問題。
我正在嘗試構建一個 dockerized Rails 應用程式,具有:測驗、開發、登臺和生產。
- 我的第一個問題是,Dockerfile 和 docker-compose 對于每個環境都應該相同嗎?
唯一會改變的是,當我想做測驗時,我在創建容器時通過 RAILS_ENV=test,當我想做開發時,我通過 RAILS_ENV=development 等等。
這會是它背后的正確想法嗎?或者它們可以不同(在我的情況下,我正在與andnginx一起構建生產,但我只有一個簡單的設定,只有and用于測驗和開發)appdbappdb
- 我的第二個問題是,例如,當我通過 RAILS_ENV=test 時,我應該在 Dockerfile 上執行此操作(在構建映像時有條件地通過不同的環境):
# Set environment
ARG BUILD_DEVELOPMENT
# if --build-arg BUILD_DEVELOPMENT=1, set RAILS_ENV to 'development' or set to null otherwise.
ENV RAILS_ENV=${BUILD_DEVELOPMENT: development}
# if RAILS_ENV is null, set it to 'production' (or leave as is otherwise).
ENV RAILS_ENV=${RAILS_ENV:-production}
或者在執行docker-compose?時保持相同的影像并通過 RAILS_ENV :
docker-compose -f docker-compose.production.yml run rake db:create db:migrate RAILS_ENV=production
謝謝!
uj5u.com熱心網友回復:
Dockerfile每個環境都應該相同嗎?
是的。構建單個映像并在所有環境中重復使用它。不要使用 DockerfileARG來傳遞“是否生產”、主機名或特定于主機的用戶 ID。特別是您應該在預生產和生產環境中使用相同的環境,以避免部署未經測驗的映像。
docker-compose.yml每個環境都應該相同嗎?
這是您必須控制部署時間選項的主要位置,例如,您的資料庫所在的位置,或者應該輸出什么級別的日志。因此,每個環境都有一個單獨的 Compose 檔案是有意義的。
Compose 支持多個 Compose 檔案。您可以docker-compose -f ...多次使用來指定要使用的特定 Compose 檔案;或者,如果您沒有該選項,則 Compose 將同時讀取 adocker-compose.yml和 a docker-compose.override.yml。所以你可能有一個基礎docker-compose.yml檔案來命名要使用的影像
# docker-compose.yml
version: '3.8'
services:
app:
image: registry.example.com/app:${APP_TAG:-latest}
在您建議的問題中,一個docker-compose.prod.yml. 這可以設定$RAILS_ENV并指向您的生產資料庫:
# docker-compose.prod.yml
services:
app:
environment:
- RAILS_ENV=production
- DB_HOST=db.example.com
- DB_USERNAME=...
# (but don't repeat image:)
您可以單獨docker-compose.dev.yml啟動一個本地資料庫,并獲得有關如何構建映像的說明:
# docker-compose.dev.yaml
version: '3.8'
services:
app:
build: .
environment:
- RAILS_ENV=development
- DB_HOST=db
- DB_USERNAME=db
- DB_PASSWORD=passw0rd
db:
image: postgres:14
environment:
- POSTGRES_USER=db
- POSTGRES_PASSWORD=passw0rd
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
如果您使用該docker-compose -f選項,則需要始終提及您正在使用的兩個檔案
docker-compose \
-f docker-compose.yml \
-f docker-compose.dev.yml \
run app \
rake db:migrate
您還可以符號鏈接docker-compose.override.yml以指向特定于環境的檔案,然后 Compose 將能夠在默認情況下找到它。
ln -sf docker-compose.test.yml docker-compose.override.yml
docker-compose run app rspec
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441499.html
