
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設定ファイルの書き方も興味があるので、今後別のブログに書こうと思います。
《関連記事》


アシスタントリーダー A.Iizuka 技術の入門・まとめ系を中心に書いてます。あとで読み返したいと感じていただける記事を目指しています。