LoginSignup
6
2

More than 3 years have passed since last update.

DockerイメージのENTRYPOITとCMDを上書きした場合の挙動について

Last updated at Posted at 2019-06-06

背景

ある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 "$@"
6
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
6
2