背景
あるDockerイメージのENTRYPOINTに指定されたシェルの前にちょっとした処理を入れたくて、ENTRYPOINTを上書き定義したら想定外の挙動をしたのでその結果の記録です。
実験に使ったもの
Dockerfile
FROM busybox
ENTRYPOINT [ "echo" ]
CMD [ "param1", "param2", "param3"]
docker-compose.yml
version: '3.5'
services:
non-override:
container_name: non-override
image: test
build: .
entrypoint-override:
container_name: entrypoint-override
image: test
entrypoint: echo "overwride entrypoint. parameters =>"
command-override:
container_name: command-override
image: test
command: foo bar baz
both-override:
container_name: both-override
image: test
entrypoint: echo "overwride entrypoint. parameters => "
command: foo bar baz
結果
[docker@docker-host test]$ docker-compose up --build
Building non-override
Step 1/3 : FROM busybox
---> 64f5d945efcc
Step 2/3 : ENTRYPOINT [ "echo" ]
---> Running in 98a926f84654
Removing intermediate container 98a926f84654
---> 29d72f5786f0
Step 3/3 : CMD [ "param1", "param2", "param3"]
---> Running in 4c3fff18bbfe
Removing intermediate container 4c3fff18bbfe
---> 214995d47fad
Successfully built 214995d47fad
Successfully tagged test:latest
Creating entrypoint-override ... done
Creating non-override ... done
Creating both-override ... done
Creating command-override ... done
Attaching to both-override, command-override, entrypoint-override, non-override
both-override | overwride entrypoint. parameters => foo bar baz
command-override | foo bar baz
entrypoint-override | overwride entrypoint. parameters =>
non-override | param1 param2 param3
both-override exited with code 0
command-override exited with code 0
entrypoint-override exited with code 0
non-override exited with code 0
[docker@docker-host test]$
結論
ENTRYPOINTを上書きするとDockerイメージのCMDがNULLになる
entrypoint-override | overwride entrypoint. parameters =>
の結果からイメージのCMDがnullに上書きされていると思われるのでdocker inspectで確認。
[docker@docker-host test]$ docker inspect entrypoint-override | jq '.[].Config | .Entrypoint,.Cmd'
[
"echo",
"overwride entrypoint. parameters =>"
]
null
[docker@docker-host test]$
というわけで、以下のような独自のEntryPointシェルとかを作ってイメージのENTRYPOINTを上書きした場合は元のイメージのCMDを調べたうえで、Shell自体にCMDの内容を書くか、dockerコマンドの最後の引数、docker-composeのcommandに同じものを指定しないとダメでした。。
docker-entrypoint.sh
# !/bin/bash
set -euo
# 何かの処理
# 元のイメージをCMDは引数にならないよ!!
exec "$@"