当サイトは、アフィリエイト広告を利用しています

【Docker】コンテナに環境変数を設定する方法

作成日:2024月07月08日
更新日:2024年07月09日

Dockerを使ったコンテナ作成時に環境変数を設定する方法を
調べたのでまとめる。

コンテナに環境変数を設定する方法は大きく

  • Dockerfileで設定
  • docker-compose.ymlで設定

の2種類がある。

Dockerfileとdocker-compose.ymlで設定した場合の違い

それぞれで違いあるので用途によって使い分ける必要がある。

Dockerfileで設定した場合

Dockerfileで設定した場合は
イメージのbuild時に環境変数が設定されるため
そのイメージを使ってコンテナを作った場合
環境変数がすべて同じになる

なので

  • 環境変数をイメージに組み込みたい
  • どのコンテナでも環境変数を固定にしたい(変える必要がない)

場合はDockerfileで設定する

docker-compose.ymlで設定した場合

docker-compose.ymlで設定した場合はコンテナ実行時に
環境変数が設定されるため
同じイメージを使用していてもコンテナごとに環境変数を変えることができる

なので

  • 実行時に異なる環境変数を指定したい
  • 同じイメージを使用してもコンテナごとにで異なる環境変数で実行したい

場合はdocker-compose.ymlで設定する

両方設定した場合

Dockerfileとdocker-compose.ymlの両方で設定した場合は
実行時に設定される方が優先されるため
同じ環境変数がある場合はdocker-compose.ymlの方で上書きされる

dockerfileでコンテナに環境変数を設定する

dockerfileでコンテナに環境変数を指定する場合は
「ENV」を使用する

Dockerfile
FROM python:3.10
# 環境変数を設定
ENV FLASK_ENV=development
ENV FLASK_DEBUG=true
# /workspaceディレクトリを作成
RUN mkdir -p /workspace
# /workspaceディレクトリに移動
WORKDIR /workspace

ENVを使用すると、その環境変数はイメージのビルド時に設定され、
ビルドされたイメージを実行するコンテナ内で利用可能になる。

イメージで実行されているため、このイメージから作成される
すべてのコンテナで設定した環境変数が使用可能になる

ちなみに下記のように書くことも可能。

Dockerfile
ENV FLASK_ENV=development FLASK_DEBUG=true

ただ個人的には見づらいので行を分けた方がいいと思う。

docker-compose.ymlでコンテナに環境変数を設定する

docker-compose.ymlでコンテナに環境変数を設定する場合は
方法は

  • environmentセクションを使ってdocker-compose.yml内で設定
  • env_fileセクションを使って、「.envファイル」を読み込み設定

の2つがある

environmentセクションを使う

environmentで環境変数を設定できる

docker-compose.yml
version: "3"
services:
python3:
container_name: "container_python3"
image: python:3.10
environment:
- FLASK_ENV=development
- FLASK_DEBUG=true
volumes:
- .:/workspace
tty: true

環境変数が少ない場合はこちらでサクッと設定してしまう方がいいかもしれない。

env_fileセクションを使う

env_fileセクションを使う場合は.envファイルを用意する必要がある

.env
FLASK_ENV=development
FLASK_DEBUG=true

env_fileセクションで.envを読み込む

docker-compose.yml
version: "3"
services:
python3:
container_name: "container_python3"
image: python:3.10
env_file:
- .env
volumes:
- .:/workspace
tty: true

別の階層に.envがある場合は下記のように相対パスを設定する必要がある

yml
env_file:
- ./docker/.env # .env ファイルの相対パス

複数の環境変数を扱う場合は、.envファイルで外出ししておいたほうが
管理しやすい

実際にコンテナを作って確認する

それぞれのパターンでコンテナを作って確認してみる

下記の構成で確認する

構成
.
|-- .env
|-- Dockerfile
`-- docker-compose.yml

Dockerfileで設定する場合

Dockerfileを使ってコンテナの環境変数を設定する方法を試す。
下記ファイルを編集する

  • Dockerfile
  • docker-compose.yml

Dockerfile

Dockerfile
FROM python:3.10
# 環境変数を設定
ENV FLASK_ENV=development
ENV FLASK_DEBUG=true
# /workspaceディレクトリを作成
RUN mkdir -p /workspace
# /workspaceディレクトリに移動
WORKDIR /workspace

ENVで環境変数を設定

docker-compose.yml

docker-compose.yml
version: "3"
services:
python3:
container_name: "container_python3"
build:
context: .
dockerfile: Dockerfile
# environment:
# - FLASK_ENV=development
# - FLASK_DEBUG=true
volumes:
- .:/workspace
tty: true

docker-compose実行時にDockerfileをbuildしてimageを作るようにする
enviromentはコメントアウトしておく

コンテナ作成を実行

コンテナ作成
# コンテナ作成
$ docker compose up -d --build
# コンテナ作成確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46a3a27be814 docker-env-python3 "python3" 19 seconds ago Up 18 seconds container_python3
# コンテナにログイン
$ docker exec -it container_python3 bash
# 環境変数確認
root@46a3a27be814:/workspace# echo $FLASK_ENV
development
root@46a3a27be814:/workspace# echo $FLASK_DEBUG
true

Dockerfileで設定した環境変数が設定されている

docker-compose.ymlで設定

docker-compose.ymlを使ってコンテナの環境変数を設定する方法を試す。
下記ファイルを編集する

  • docker-compose.yml

docker-compose.yml

docker-compose.yml
version: "3"
services:
python3:
container_name: "container_python3"
image: python:3.10
environment:
- FLASK_ENV=development
- FLASK_DEBUG=true
volumes:
- .:/workspace
tty: true

enviromentで環境変数を設定 ※イメージはpython:3.10を使用するため、Dockerfileは使わない

コンテナ作成を実行

環境変数確認
# コンテナ作成
$ docker compose up -d --build
# コンテナ作成確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4dfd182774b0 python:3.10 "python3" 15 seconds ago Up 14 seconds container_python3
# コンテナにログイン
$ docker exec -it container_python3 bash
# 環境変数確認
root@4dfd182774b0:/# echo $FLASK_ENV
development
root@4dfd182774b0:/# echo $FLASK_DEBUG
true

docker-compose.ymlで設定した環境変数が設定されている

両方で設定

最後に両方で設定してみる
下記のファイルを編集する

  • Dockerfile
  • docker-compose.yml

Dockerfile

Dockerfile
FROM python:3.10
# 環境変数を設定
ENV FLASK_ENV=development
ENV FLASK_DEBUG=true
# /workspaceディレクトリを作成
RUN mkdir -p /workspace
# /workspaceディレクトリに移動
WORKDIR /workspace

ENVで環境変数を設定

docker-compose.yml

docker-compose.yml
version: "3"
services:
python3:
container_name: "container_python3"
build:
context: .
dockerfile: Dockerfile
environment:
- FLASK_DEBUG=false
volumes:
- .:/workspace
tty: true

enviromentでDockerfileと同じ環境変数「FLASK_DEBUG」を指定する

コンテナ作成を実行

環境変数確認
# コンテナ作成
$ docker compose up -d --build
# コンテナ確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b5ee103c38e docker-env-python3 "python3" 38 seconds ago Up 34 seconds container_python3
# コンテナログイン
$ docker exec -it container_python3 bash
# 環境変数確認
root@4b5ee103c38e:/workspace# echo $FLASK_ENV
development
root@4b5ee103c38e:/workspace# echo $FLASK_DEBUG
false

FLASK_DEBUGはdocker-compose.ymlで設定したもので上書きされている

まとめ

Dockerfileとdocker-compose.ymlのそれぞれでコンテナの
環境変数を設定する方法をまとめた。

それぞれで使い分ける必要があるので
上手く利用していきたい。

参考

関連記事

新着記事

タグ別一覧
top