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
docker compose up
docker compose up

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

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

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

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

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

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

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

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

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

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

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

docker ps -a
docker ps -a
docker ps -a

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

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

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

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

netstat -aon | findstr ポート番号
netstat -aon | findstr ポート番号
netstat -aon | findstr ポート番号

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

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

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

docker ps -a
docker ps -a
docker ps -a

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

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

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

イメージとコンテナを再作成する
docker compose up
docker compose up
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