次のdocker-composeファイルがあります。
db:
build: .
environment:
- MYSQL_ROOT_PASSWORD=password
- ENV=test
env_file: .env
Dockerfileで宣言せずに、Dockerfileの一部としてdocker-compose.ymlで宣言されたenv変数を(環境として、またはenv_fileで宣言して)使用する方法はありますか?このようなもの:
FROM Java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
この質問はずっと前に尋ねられましたが、ここに同様の質問への回答があります: Docker-composeからビルド段階でコンテナーに環境変数を渡す
基本的に、コンテナのビルド時に変数を使用するには、docker-compose.yml
で変数を定義する必要があります。
build:
context: .
args:
MYSQL_ROOT_PASSWORD: password
ENV: test
Dockerfile
を使用してARG
で参照します:
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/
*.env
ファイルで定義されている環境変数については、ビルド時にそれらをコンテナーに渡すことができないと思います。
このアプローチは、DockerおよびほとんどのDevOpsアプローチの背後にある「一度構築してどこでも実行する」理論に反します。このアプローチでは、使用する予定のすべての環境用のコンテナーを構築する必要があります。そうすることで、同じコンテナを使用していないため、コンテナが開発環境で機能するかどうかをステージングとプロダクションで機能するとは言えません。
コンテナーに必要なすべての構成ファイルを追加し、コンテナーの起動時にその環境のデータを正しい場所に選択/コピーする entrypoint スクリプトを作成することをお勧めします。このアプローチは、jinja2テンプレートを使用したテンプレート化されたApache構成など、コンテナーの他の構成にも適用できます。
それはこのように大丈夫です:
docker-compose.yml
version: '3.5'
services:
container:
build:
context: .
args:
ENV: ${ENV} # from .env file
env_file:
- .env
Dockerfile
# from compose args
ARG ENV
ADD ${ENV}/data.xml /data/
.env
ENV=myenv
したがって、すべての値は.envファイルから取得されます