[解決済み] Dockerfileを散らかさずに、複数の環境変数を読み込むには?
質問
大量の環境変数を持つ単純なDockerイメージに取り組んでいます。docker-composeのように環境変数ファイルをインポートすることは可能でしょうか?dockerファイルのドキュメントを見ても、これに関する記述が見当たりません。
ドッカーファイル
FROM python:3.6
ENV ENV1 9.3
ENV ENV2 9.3.4
...
ADD . /
RUN pip install -r requirements.txt
CMD [ "python", "./manager.py" ]
質問を言い換えると、「Dockerfileで複数の環境変数を効率的に読み込むにはどうしたらいいか」ということになりますね。もし読み込むことができなければ、DockerfileをGitHubにコミットすることはできないでしょう。
どのように解決するのか?
はい、いくつかの方法があります。
Dockerコンポーズ
Docker Composeでは、ファイル自体に環境変数を与えることも、外部のenvファイルを指すこともできます。
# docker-compose.yml
version: '2'
services:
service-name:
image: service-app
environment:
- GREETING=hello
env_file:
- .env
ちなみに、少し関連した機能として、複数のComposeファイルを使用し、後続のファイルがそれぞれ他のファイルに追加できるのも良い点です。つまり、上記のようにベースを定義しておけば、(例えばランタイム環境ごとに)こんなことができるようになります。
# docker-compose-dev.yml
version: '2'
services:
service-name:
environment:
- GREETING=goodbye
そして、このように実行することができます。
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
Dockerのみ
Dockerのみで行う場合は、エントリーポイントやコマンドで中間スクリプトを実行するように、このようにします。
#Dockerfile
....
ENTRYPOINT ["sh", "bin/start.sh"]
そして、スタートスクリプトに
#!/bin/sh
source .env
python /manager.py
私は この関連回答はこちら 過去に自分自身の参考にしたことがある。
PID 1の更新について
コメントでの発言を補足すると、エントリーポイントをシェルやPythonスクリプトにした場合、おそらく Unixシグナル (stop,killなど)がプロセスに渡されることはありません。これは、そのスクリプトが プロセスID 1 Linux/Unixでは、このPIDが子プロセスにシグナルを転送することが期待されていますが、あなたが明示的に実装しない限り、それは起こりません。
これを修正するために、initシステムをインストールすることができます。私が使っているのは Yelpのdumb-init . このレポには、もう少し理解したいという方のために詳細な説明もありますし、ただ "インストールして忘れたい" という方のために簡単なインストール手順もあります。
関連
-
[解決済み] アルパインリナックスにGoをインストールする方法
-
[解決済み] Dockerfileの'COPY'と'ADD'コマンドの違いは何ですか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] DockerfileのCMDとENTRYPOINTの違いは何ですか?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナに環境変数を渡すにはどうしたらいいですか?
-
[解決済み] Dockerfileで、PATH環境変数を更新するには?
-
[解決済み】Dockerfileのif else条件で外部引数を指定した場合
-
[解決済み】非 root で Docker COPY するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Dockerエラー:無効な参照形式:リポジトリ名は小文字でなければならない
-
[解決済み] dockerでビルド中に環境変数を設定する方法
-
[解決済み] Docker Composeでコンテナにファイルをコピーする
-
[解決済み] ARGとENV、この場合どちらを使うか?
-
[解決済み】docker composeで環境変数を使用する方法
-
[解決済み】dockerの内部からdockerを実行しても大丈夫ですか?
-
[解決済み】docker-composeからdockerに接続できない。
-
[解決済み】アプリケーションのヘルスチェックに/healthzを使用する慣習はどこから来ているのでしょうか?
-
[解決済み】Dockerのコンテナイメージが大きいのはなぜですか?
-
[解決済み】Kubernetes イメージを更新するデプロイメントの作り方