Skip to Content

Docker STATUS Exited(1)の切り分け方法

概要

Dockerfileからコンテナをビルド後、コンテナを起動してもSTATUSがExited(1)落ちてしまう。
原因を切り分けるため、落ちたコンテナにログインして調査する。

結論

落ちたコンテナIDを確認

> docker ps -a
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS                      PORTS               NAMES
[ここのID]        bigmuramura/tcp_server:v3   "/app/tcp_server"   6 seconds ago       Exited (1) 4 seconds ago                        blissful_wescoff

落ちたコンテナを適当な名前でイメージ化

docker commit [ここのID] [適当な名前付ける]

落ちたコンテナを起動してshellで入る

> docker run --rm -it [さっき付けた名前] sh

事の発端

  1. Goで書いた簡素なTCP/IPサーバをビルドし、バイナリを作成
  2. Goのバイナリをalpineイメージの載せて実行するDockerfileを作成
  3. Dockerfileをビルドし、コンテナイメージを作成
  4. docker runするもコンテナが起動しないで落ちてる

Dockerfileの作成

alpineイメージに、tcp_serverという名前の実行ファイルをコピーして実行する

FROM alpine:3.9

WORKDIR /app
COPY tcp_server /app

EXPOSE 9999

CMD ["/app/tcp_server"]

コンテナイメージの作成

コンテナは正常に完成

> docker build -t bigmuramura/tcp_server:v3 .
Sending build context to Docker daemon  2.971MB
Step 1/4 : FROM alpine:3.9
 ---> 055936d39205
Step 2/4 : WORKDIR /app
 ---> Using cache
 ---> ba7162f7a94f
Step 3/4 : COPY tcp_server /app
 ---> Using cache
 ---> a2d585922588
Step 4/4 : CMD ["/app/tcp_server"]
 ---> Using cache
 ---> acf41401cd86
Successfully built acf41401cd86
Successfully tagged bigmuramura/tcp_server:v3

イメージの確認

> docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
bigmuramura/tcp_server                   v3                  acf41401cd86        24 minutes ago      8.5MB

出来たてのイメージを実行

> docker run -it -d -p 9999:9999 bigmuramura/tcp_server:v3
ff089888ee8397411898503670b591451d52cfa78758a90700ae01167dc4c606

起動していない…
STATUS Exited(1)で止まっている

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

> docker ps -a
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS                      PORTS               NAMES
ff089888ee83        bigmuramura/tcp_server:v3   "/app/tcp_server"   6 seconds ago       Exited (1) 4 seconds ago                        blissful_wescoff
~~~

切り分け方法

落ちたコンテナをイメージにする

Exite(1)になっているCONTINER IDを確認する
今回は”ff089888ee83”が対象のコンテナID

> dcoker commit [コンテナID] [イメージ名]

実行サンプル

docker commit ff089888ee83 tcp_server-ex3
sha256:a33c4d03e73a3d4fa39a52ddd8aecbd3d663bb23be281236eb242e4cbc5caf13

イメージ名”tcp_server-ex3”のイメージが作成された

docker images
REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
tcp_server-ex3                           latest              a33c4d03e73a        7 seconds ago       8.5MB

起動中のコンテナにshellで入る

落ちたコンテナに入れたので調査
“ls -l”で確認すると、”tcp_server”はコピーされており、実行権限もある
しかし、”tcp_serveer”を実行できない
go build したバイナリファイルに問題がありそうなことがわかった

> docker run --rm -it tcp_server-ex3 sh
/app # ls -l
total 2900
-rwxrwxr-x    1 root     root       2966660 Jun 11 10:48 tcp_server
/app # ./tcp_server
sh: ./tcp_server: not found

go buildの問題

別記事でビルド方法について書きました
alpineイメージにgo build済みのバイナリを載せて実行

感想

alpineにバイナリ置くだけと思ったが以外にもハマってしまった

参考

https://skworkspace.net/archives/485