0

コマンドラインで指定可能な終了コードを持つ Docker イメージを作成したいと考えています。この質問から、実行可能ファイルではなくシェルの組み込みコマンドであるためexit、引数として使用する必要があることを学びました: How to make a docker container exit with a specific error-code with docker-compose?sh

つまり、次のようにエラー コード 42 で終了する Docker コンテナーを作成できます。

# Dockerfile
FROM alpine:3.15 as base
ENTRYPOINT ["sh", "-c", "exit 42"]
$ docker build -t tmp:tmp . && docker run tmp:tmp
[+] Building 0.4s (5/5) FINISHED
 => [internal] load build definition from Dockerfile                                          0.0s
 => => transferring dockerfile: 181B                                                          0.0s
 => [internal] load .dockerignore                                                             0.0s
 => => transferring context: 2B                                                               0.0s
 => [internal] load metadata for docker.io/library/alpine:3.15                                0.0s
 => CACHED [1/1] FROM docker.io/library/alpine:3.15                                           0.0s
 => exporting to image                                                                        0.0s
 => => exporting layers                                                                       0.0s
 => => writing image sha256:3034115e85f4ac9322c3e3e5d69f4445e30cc652f3b836d0145545305fda6ad1  0.0s
 => => naming to docker.io/library/tmp:tmp                                                    0.0s
$ echo $?
42
$

質問:
コマンドライン引数として指定された終了コードを docker コンテナーが返すようにすることはできますか?
たとえば、これは可能です:

$ docker build -t tmp:tmp . && docker run tmp:tmp 64
...
$ echo $?
64
$

?

私が試したこと:
この記事 -- https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/ -- と のこの組み合わせを試すようにENTRYPOINTなりましたCMD:

# Dockerfile
FROM alpine:3.15 as base
ENTRYPOINT ["sh", "-c", "exit"]
CMD ["0"]
$ docker build -t tmp:tmp . && docker run tmp:tmp 64
...
$ echo $?
0

興味深いことに、Dockerfile のこれと同じ「パターン」が次のように機能しましたecho

# Dockerfile
FROM alpine:3.15 as base
ENTRYPOINT ["echo", "hello"]
CMD ["world"]
$ docker build -t tmp:tmp . && docker run tmp:tmp
...
hello world
$
$ docker build -t tmp:tmp . && docker run tmp:tmp foo
...
hello foo
$

私の失敗した実験は、次の実験で説明されているENTRYPOINTと思います。CMD

$ sh -c "exit 42"
$ echo $?
42
$ sh -c "exit" 42
$ echo $?
0

... と を使用した Dockerfile が前者になることを望んでいENTRYPOINT ["sh", "-c", "exit"]ましCMD ["0"]たが、後者になると思います-本当ですか?

4

2 に答える 2