Dockerコンテナ作成時に exited with code 1 が発生

こんにちは、飯塚です。
 
コマンドを流すだけで環境を作ることができるDockerは便利ですね。しかし、他の方の環境は問題ないのに、私の場合だけコンテナが起動しないという事象がありました。
 
結論としては、Linux仮想環境としてHyper-VではなくWSL2.0を使ったのが原因でした。仮想環境のアプリが異なると、Dockerfile, docker-compose.yml で一部のコマンドを書き換える必要があるようです。解決方法と原因の調査方法をまとめました。
 
環境は以下の通りです。

OS
Windows 10
Linux
Ubuntsu 20.04.4 LTS
Docker
20.10.17
Docker Compose
2.2.3

エラー内容:コンテナ作成時に「xxxxx exited with code 1」が発生する

Dockerのコンテナを作成する

docker compose up

下記のログが表示され、コンテナが起動していません。
xxxxx exited with code 1

結論:Dockerfile, docker-compose.ymlを一部書き換える

(1) マウントがされない
ファイルのマウントがされなかったので、DockerfileにCOPYコマンドを追加して対応しました。
(修正前)
docker-compose.yml

    volumes:
      - ./xxxxx/apache/config/php.ini:/etc/php.ini

(修正後)
Dockerfile
COPY ./xxxxx/apache/config/php.ini /etc/php.ini

(2) Dockerfileでpostfixのrestartコマンドが使えない
(修正前)
ENTRYPOINT /usr/sbin/postfix restart && \

(修正後)
ENTRYPOINT /usr/sbin/postfix start && \
           /usr/sbin/postfix reload && \

(3) Dockerfileでgit clone時にgit://を使用できない。
(修正前)
RUN git clone git://github.com/xxxxx

(修正後)
RUN git clone https://github.com/xxxxx

調査方法1:まずはログを調べる

まずはログを調べます。
 
コンテナのIDを調べる。 -aを付けると起動していないコンテナも表示できる

docker ps -a

コンテナのログを調べる。
docker logs コンテナID

※原因によっては「xxxxx exited with code 1」の1行しか出力されず、他に情報が出ないことがあります。

調査方法2:既にポートを使用していないか確認する

Windowsのコマンドプロンプトで実行

netstat -aon | findstr ポート番号

よくあるのが、Windows環境でDBのサービスが起動していたために、同じポートを利用するDockerのコンテナが起動しないケースです。その場合は、Windowsの「サービス」から対象のDBのサービスを停止して、コンテナを起動します。
Linux環境で実行
ss -antu | grep ポート番号

調査方法3:地道にコメントアウトして、コンテナを再作成する

賢い方法ではないですが、今回の場合はこの方法で原因が分かりました。docker-compose.yml または Dockerfile の怪しそうな箇所を少しずつコメントアウトして、「イメージの削除 ~ コンテナの再作成」を繰り返して、原因を特定します。
 
「イメージの削除 ~ コンテナの再作成」のコマンドは下記です。
 
動いていないコンテナ含めて、コンテナIDを確認する

docker ps -a

コンテナを削除する
docker rm コンテナID

イメージ名を確認する
docker images

イメージを削除する
docker rmi イメージ名

イメージとコンテナを再作成する
docker compose up

どうしても分からない場合は、他の人のイメージをもらう

どうしても原因が分からない場合は、既にDockerのコンテナ起動が成功している人から、Imageをもらって、それを使ってコンテナを作成する方法もあります。
 
【stack overflow】How to copy Docker images from one host to another without using a repository

まとめ

いかがでしょうか。
 
今回プロジェクトで初めてDockerを使用したので整理のためにブログに書きました。Linuxの仮想環境として、何を使うのか最初に統一しておいたほうが良いでしょう。
 
ただ、現実問題としてコスト的な理由で、全員が有料の仮想環境を使えないケースはありそうです。どの仮想環境でもスムーズに動くDocker設定ファイルの書き方も興味があるので、今後別のブログに書こうと思います。
 
 
 
 
《関連記事》

使えるLinuxコマンド20選
技術
2016.3.4(Fri)

サーバーを操作せざるを得なくなってしまったプログラマーに捧ぐ 使えるLinuxコマンド20選

#まとめ
 

便利なVimコマンド
技術
2022.5.27(Fri)

ログ調査で大活躍! 知っていると便利なVimコマンド【検索 / コピー / ドキュメント操作】

#まとめ#プログラム#ツール
 

Laravel×Dockerで環境構築
技術
2022.6.24(Fri)

手順をすべて紹介。Windows環境にLaravel×Dockerで環境構築する方法

#PHP
 

記事をシェア
MOST VIEWED ARTICLES