web-dev-qa-db-ja.com

Dockerbuildファイルでdocker-compose env変数を使用する

次の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"]
19
ecyshor

この質問はずっと前に尋ねられましたが、ここに同様の質問への回答があります: 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ファイルで定義されている環境変数については、ビルド時にそれらをコンテナーに渡すことができないと思います。

17
BartoNaz

このアプローチは、DockerおよびほとんどのDevOpsアプローチの背後にある「一度構築してどこでも実行する」理論に反します。このアプローチでは、使用する予定のすべての環境用のコンテナーを構築する必要があります。そうすることで、同じコンテナを使用していないため、コンテナが開発環境で機能するかどうかをステージングとプロダクションで機能するとは言えません。

コンテナーに必要なすべての構成ファイルを追加し、コンテナーの起動時にその環境のデータを正しい場所に選択/コピーする entrypoint スクリプトを作成することをお勧めします。このアプローチは、jinja2テンプレートを使用したテンプレート化されたApache構成など、コンテナーの他の構成にも適用できます。

7
andyberry88

それはこのように大丈夫です:

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ファイルから取得されます

2
Daniel Titkov