心地よいライフハック

これ便利だな〜と思ったことなど

docker コンテナ内の 設定ミス で動かなくなったら、、、

 もし docker コンテナ 内の 設定 ファイルの編集ミスなどをしてしまって、
コンテナが起動しなくてしまったら、 何も知らないと結構困る。
 
起動しなくなったコンテナを、無理やり起動させて、修正作業ができるようにしたい。 
 
「docker logo」の画像検索結果

 
 
 
ここの通り対処すればOK かと思うが、、
 
 
自分は、上記とは、多少 環境が 異なるため、一応 ここに 記録。
 

< できた環境 > 
 
ホストOS macos 10.13.6 ターミナル
仮想 ( VM ) CentOS
CentOS Linux release 7.4.1708 (Core)
 

 
まず Docker ホストの OS に ログイン状態
# docker -v
Docker version 1.13.1, build 07f3374/1.13.1
 
停止した コンテナの ID を確認 (前方の数桁がわかればOK)
# docker ps -a
・・・

 
 
該当 コンテナのディレクトリ へ移動
cd /var/lib/docker/containers/ae98d...4f6/

( * 編集前に この ファイル のバックアップを忘れずに! )
cp -p 上記config.v2.json /バックアップ退避しておきたいディレクトリ/config.v2.json
 
一時的にコンテナ起動時コマンドを編集する
vi ./config.v2.json
 
> 編集 内容
コンテナ起動時のコマンド と そのコマンドの引数を 操作する。
 
コマンド  “ Path “ 要素にかかれたものを適当なコマンドに変更する。
“ PATH “ ではないので注意。
 
たとえば  tail 。 node-red コンテナの場合は  以下のように指定した。
 

“Path" : “ /usr/bin/tail "
 
 
/usr/bin/tail 
 
続いて そのコマンドの引数の指定は “ Args “ で。
確実に有効な オプションや、ファイルパス を指定する。
 

"Args":["-f","/usr/src/node-red/package.json"]
 
 
上記で 指定 うまくいくと コンテナ起動時
tail -f /usr/src/node-red/package.json 
というコマンドがうまくいけば  コンテナが立ち上がりっぱなしになる。
 
編集した config.v2.json を 有効化する。
 
# systemctl restart docker
 
# docker start -ai  問題のコンテナ名
 
ここで、上記 で 設定した指定がうまくいけば、 立ち上がる。
立ち上がらなければ、 エラー内容を よく読み config.v2.json で 対処できそうな 問題なら、それで 立ち上げる。
 
もしうまく立ち上がったらなら、 上記の例では tail -f コマンド を実行したままになるはず。
 
この状態で、通常起動時の問題箇所を修正しておく。
( 自分の場合は、 node-red コンテナの /data/setting.js の内容を修正した。)
 
この時、 ctrl + p つづけて q と押す  と コンテナ は デーモン化して バックグラウンドへ。
 
docker ホスト側 の ターミナル操作に復帰できる。
 
また、修正したければ docker exec -it コマンドで 中に入って修正作業できる と思う。
 
 
 修正が完了したら、さきほどバックアップした、config.v2.json を使って通常コンテナ起動の設定に戻す。
( cp -p バックアップ退避しておいたパス/config.v2.json 起動方法を弄ったconfig.v2.json )
 
⬇︎その config.v2.json を 有効化する。
# systemctl restart docker
 

 
あとは通常通り、起動 できればOK。
問題があれば、docker logs コマンドを使ったりして 解析を進めよう。