1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

docker-compose.ymlの環境変数でハマったこと

Last updated at Posted at 2024-06-14

docker-compose で数日めちゃくちゃハマったので、メモしておきます。たぶん、ハマったのは私だけではないはず。

環境変数を設定しても反映されない場合がある?!

docker-compose.ymlenvironmentに環境変数を設定できるとみんな言っています。そして、その通り、反映されます。

しかし、docker-compose.ymlの中で別途Dockerfileをビルドする場合、その環境変数は設定されません。

なぜなら…

Dockerfileは、Dockerイメージを構築するために使用される設定ファイルです。 Dockerfileには、イメージに含まれるファイルやアプリケーションの設定などが記述されます。 Docker Composeは、複数のDockerコンテナを組み合わせてアプリケーションを実行するためのツールです。docker-compse.ymlは、Docker Composeのための設定ファイルです。

つまり、docker-compose.ymlに指定する環境変数は、イメージをビルドする際、有効になるのではなく、コンテナで有効になるからです。こんな簡単なことに気付くのに、数日かかってしまうとは…。

Dockerfileのビルドで環境変数を指定する場合

Dockerfileの中で環境変数を使いたい場合には、素直に、DockerfileのENVを使って環境変数を指定するのが良いです。

# ベースイメージの指定
FROM python:3.9-slim-buster

# 環境変数を指定(ただし、以下のコマンド実行時には参照できるが他のコンテナからは参照できない)
ENV HOGE dockerfile
ENV FUGA bbb
ENV APP_DIR /app

# ローカルのファイルをコピー
COPY ./app /app

# 作業ディレクトリを設定
WORKDIR ${APP_DIR}
RUN python3 ${APP_DIR}/print_hoge.py > hoge1.txt
  • Dockerfileの中でENVを指定すると環境変数を定義できる
  • この場合、このイメージから作ったコンテナでは環境変数が有効

docker-compose.ymlに書く場合

docker-compose.ymlenviromentに環境変数を列挙できます。ただし、前述のように、Dockerfileのビルド時には反映されません。

docker-compose.yml
version: '1'
services:
  test_service:
    # Dockerfileをビルドする
    build:
      context: .
      dockerfile: Dockerfile
    container_name: python39_test
    image: python39_test_image
    # 環境変数を設定する
    environment:
      - HOGE=docker-compose.yml
      - bbb=bbb
      - ccc=30
    #  複数のコマンドを実行する
    command: >
      /bin/sh -c "
        python3 /app/print_hoge.py > hoge2.txt
        while true; do
          sleep 3600
        done
      "
  • envirmentに環境変数を列挙できる
  • ただし、Dockerfileのビルド時に環境変数を指定できない(もし指定したい場合は以下を参照)

docker-compose.ymlからDockerfileに変数を与える場合

docker-compose.ymlの中で、Dockerfileに値を与えたい場合、以下のように、buildargsに値を指定し、Dockerfileの中でARGを宣言することにより、使うことができます。

docker-compose.yml
version: "2"
services:
  test_service:
    # 環境変数を定義
    enviroment:
      - HOGE=Dockerfile
    # Dockerfileをビルドする
    build:
      context: .
      dockerfile: Dockerfile
      # Dockerfile に渡す変数を指定✨✨✨
      args:
        - FUGA=fuga
        # 上記で宣言した環境変数も渡せる
        - HOGE=${HOGE}
    container_name: python39_test
    image: python39_test_image

そして、Dockerfileの中でARGを定義

# ベースイメージとしてAlpineを使用
FROM python:3.9-slim-buster

# 変数を明示的に定義 --- これが必須✨✨✨
ARG HOGE

COPY ./app /app

# 作業ディレクトリを設定
WORKDIR /app
RUN python3 print_hoge.py > hoge1.txt

環境変数にダブルクォートをつけていた

docker-compose.ymlenvironmentに環境変数を設定できるとみんな言っています。そして、その通り、反映されます。しかし、値を指定するとき、シェルコマンドのようにNAME="VALUE"と書くと、ダブルクォートを含めて環境変数に設定されます。

例えば...

docker-compose.yml
version: '1'
services:
  test_service:
    # Dockerfileをビルドする
    build:
      context: .
      dockerfile: Dockerfile
    container_name: python39_test
    image: python39_test_image
    # 環境変数を設定する
    environment:
      # ダブルクォート付きの値を指定した --- (※1)
      - HOGE="HOGE"
      - FUGA=FUAG

上記(※1)で、echo $HOGE すると、"HOGE"が設定されているのを確認できます。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?