はじめに
「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
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!"]
しかし、同じエラーが発生します。
CMD
とENTRYPOINT
を使った時だけエラーになり、そこをなくすとコンテナは問題なく起動しました。
解決方法
DockerでENTRYPOINTを指定すると、コンテナが起動しない
こちらの記事で原因がわかりました。
CMDやENTRYPOINTを指定した場合、コンテナでコマンドを起動した後にコンテナを終了してしまうようです。
ですので、シェルスクリプトの中で終了しないようにする工夫が必要になります。
たとえば、シェルスクリプトの中で無限ループ
を発生させます。
#!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のデバックあんまり知らないので学んでいきたいです。