この記事は公開から2年以上経過しています。
Linux版DockerでDockerコンテナ内で行った変更が原因でDockerがExited (x)で起動できなくなってしまった際、コンテナの変更を新しいイメージにコミットする方法ではなく、コンテナの設定ファイル(メタデータ)を修正してから解決する方法。
※x:エラーコード
本対応はDockerで構築したRedmineコンテナに入れたプラグインが原因でExited (1)が発生して起動できなくなってしまった際に行った対応の備忘録です。
対応
-
修復対象コンテナのコンテナIDを調べる。
docker ps -a
-
修復対象コンテナの実体ディレクトリ(ホストマシン上)に入る。
su cd /var/lib/docker/containers/修復対象コンテナのコンテナID*
※コンテナID末尾にワイルドカードの
*
を付加します。 -
修復対象コンテナのコンテナ設定ファイルをバックアップ、テキストエディターで開く。
cp config.v2.json config.v2.json.bak vim config.v2.json
-
修復対象コンテナの起動状態を維持するために、修復対象コンテナのコンテナ設定ファイルの
Path
とArgs
を/bin/sleep 1d
に書き換える。"Path":"/bin/sleep","Args":["1d"]
-
Dockerサービスの再起動を行う。
systemctl restart docker
-
修復対象コンテナを起動する。
docker start -ai 修復対象コンテナ名
-
新しいシェルから修復対象コンテナに入る。
docker exec -it 修復対象コンテナ名 bash
-
修復対象コンテナ内でExited (x)の原因を解決する。
※私の場合はここで問題の原因となったRedmineのプラグインをアンインストール。 -
修復対象コンテナを停止する。
docker stop 修復対象コンテナ名
-
手順3でバックアップした
config.v2.json.bak
をconfig.v2.json
に戻す。cp config.v2.json.bak config.v2.json
-
Dockerサービスの再起動を行う。
systemctl restart docker
-
修復対象コンテナを起動する。
docker start -ai 修復対象コンテナ名
手順8でExited (x)が発生する問題を解決できていれば、通常どおりコンテナが起動できるようになっていると思います。
以上です。