2018年1月15日月曜日

一度 run したコンテナを削除せずに環境変数を設定する方法

概要

docker run をするときに -e で環境変数を設定することができます
しかし stop -> start や restart するときに -e オプションを使って環境変数を設定することができません
そうするとわざわざコンテナを rm する必要が出てきます
rm しないでも環境変数を設定することができたのでその方法を紹介します

環境

  • Ubuntu 16.04.3
  • docker 17.05.0-ce
  • Admiral v1.3.0

とりあえず起動する

  • docker run -d -p 80:80 --name web nginx

これで HOGE という環境変数を確認してみます

  • docker exec web /bin/bash -c 'echo "${HOGE}"'

当然ですが空文字が返ってきます

コンテナを一旦停止する

起動した nginx コンテナを一旦停止しましょう

  • docker stop web

dockerd も停止する

デーモンも停止する必要があります
(これをしなければいけないのがちょっと残念な感じがします)

  • systemctl stop docker

config.json を直接編集する

コンテナを編集したらコンテナの設定ファイルを直接編集して環境変数を設定しましょう

  • vim /var/lib/docker/containers/837764235c60d5035ec5ad7848b03724e1245d99802edd6cb72a9d8895a453b0/config.v2.json

コンテナ ID の部分は適宜変更してください
この JSON ファイルに Env という定義の部分があるのでそこに環境変数を記載します

"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NGINX_VERSION=1.13.8-1~stretch","NJS_VERSION=1.13.8.0.1.15-1~stretch","HOGE=hoge"]

改行などインデントなど整形がされていないので少し見づらいですが Env の箇所を見つけて上記のように編集しました

dockerd とコンテナを起動する

停止していたプロセスとコンテナを起動していきます

  • systemctl start docker
  • docker start web

環境変数が設定されているか確認する

先ほどの環境変数を表示するコマンドを再度実行してみましょう

  • docker exec web /bin/bash -c 'echo "${HOGE}"'

すると hoge が返ってくるようになっていると思います

最後に

一度 run で起動したコンテナに対して削除せずに環境変数を設定する方法を紹介しました
もしかするとこんなことをしないでも今後のアップデートで restart 時に設定できるようになるかもしれません

dockerd も停止する必要があるのでプロダクション環境だと他のコンテナにも影響するので使えない場合が多いかもしれません
一応知っておいて損はないと思うので紹介しました

また Docker for Mac の場合は一度 moby にログインしてからファイルを編集する必要があるので注意してください
moby に関してはこちらで紹介しています

参考サイト

0 件のコメント:

コメントを投稿