1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DockerfileでCMDとENTRYPOINTを使ったときに、コンテナが起動しない、リスタートし続ける

Last updated at Posted at 2021-08-25

はじめに

15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」という本を学習している中で、Kubernetesの環境を構築することになり、1からの構築をしています。

その過程でDockerについて深くやることになっていますが、色々エラーが起きます。

今回は、Dockrfile内で、CMDコマンドやENTRYPOINTコマンドを使うとコンテナが落ちたり、リスタートを繰り返したり問題が起きてなかなか検索しても解決にたどり着けなかったため、まとめていきたいと思います。
(検索の仕方がわるかった?)

問題

以下のファイルを用意します。

Dockerfile

FROM ubuntu:20.04

COPY entrypoint.sh /tmp
ENTRYPOINT ["/tmp/entrypoint.sh"]

docker-compose.yml

version: '3'
services:
  ubuntu:
    restart: always
    build: .
    container_name: 'ubuntu'
    tty: true

entrypoint.sh

entrypoint.sh
echo "Hello World!"

このコンテナを起動するとエラーが発生します。

$ docker-compose up

エラー

Recreating ubuntu ... done
Attaching to ubuntu
ubuntu    | Hello World
ubuntu exited with code 0

コンテナの中に入ってみると以下のようなエラー

$ docker-compose up -d
$ docker exec -it ubuntu sh
Error response from daemon: Container 16cf0c04abe4de2f466683069ac9a2511e743b813ea8088401278fa525d91057 is restarting, wait until the container is running

ENTRYPOINTを使わず、CMDを使ってみます。

FROM ubuntu:20.04

CMD ["echo", "hello world!"]

しかし、同じエラーが発生します。

CMDENTRYPOINTを使った時だけエラーになり、そこをなくすとコンテナは問題なく起動しました。

解決方法

DockerでENTRYPOINTを指定すると、コンテナが起動しない

こちらの記事で原因がわかりました。

CMDやENTRYPOINTを指定した場合、コンテナでコマンドを起動した後にコンテナを終了してしまうようです。
ですので、シェルスクリプトの中で終了しないようにする工夫が必要になります。

たとえば、シェルスクリプトの中で無限ループを発生させます。

entrypoint.sh
#!bin/sh

echo "Hello World"

while true
do
sleep 10
done

これで解決しました。

CMDであれば、以下を参考にしてみてください。

また、リスタートし続ける現象

Error response from daemon: Container 16cf0c04abe4de2f466683069ac9a2511e743b813ea8088401278fa525d91057 is restarting, wait until the container is running

は、docker-compose.ymlでrestart: alwaysにしているため、ENTRYPOINTでコマンド実行したあとコンテナが落ちて、再度起動したために表示されています。起動→シェル実行→終了→リスタートを繰り返していました。

余談

メモ程度に私のやりたかったことをまとめておきます。

docker-in-dockerをUbuntuで行っており、コンテナ内でservice docker startコマンドで起動する必要がありました。しかし、シェルスクリプトにservice docker startを書いて、コンテナを起動するとエラーになります。

これは、シェルスクリプトを実行中に起動できないことから起因してそうでした。
そこで、コンテナ内でbash entrypoint.shコマンドをすることでコンテナ内で行うコマンドをすべて一括して行うことにしました(DockerfileでENTRYPOINTをするのをやめました)

おわりに

この原因に気付くまでに時間がかかってしまいました。
しっかりとデバックができるようになるともっと早く解決できるようになりそうです。

Dockernのデバックあんまり知らないので学んでいきたいです。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?