Docker:可以将 cmdline 参数附加到 shell 内置命令参数吗?
Docker: can a cmdline argument be appended to a shell built-in command args?
我想创建一个带有 cmdline 可指定退出代码的 docker 图像。
从这个问题中,我了解到我必须使用 exit
作为 sh
的参数,因为它是 shell 内置命令,而不是可执行文件:
即我可以创建一个 docker 容器,它以错误代码 42 退出,如下所示:
# 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 容器设为 return 指定为 cmdline 参数的退出代码?
例如。这可能吗:
$ 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
...我希望带有 ENTRYPOINT ["sh", "-c", "exit"]
和 CMD ["0"]
的 Dockerfile 会产生前者,但我认为它会产生后者——是吗?
您的所有 docker 运行 参数都将传递给您的 entrypoint.sh
如果您定义了一个参数。
例如在我的 Dockerfile 中我有:
# prepare container
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
在我的 entrypoint.sh
printf "Custom exit code '$*'\n"
exit "$@"
然后只是 运行 和 args:
$ docker run verify 129
Custom exit code '129'
$ echo $?
129
$ _
你是对的,CMD
总是将其内容作为新参数传递给入口点。您不能将其作为 ENTRYPOINT
.
参数的一部分插入
我还推荐 Florin 的解决方案,即自定义入口点。但是,如果你真的需要,你仍然可以只使用 shell 来完成:
from alpine
entrypoint ["/bin/sh", "-c", "exit \"$@\"", "sh"]
cmd ["42"]
这将 运行 sh
有 4 个参数,分别是 -c
、exit "$@"
、sh
和 42
(或您的命令) .最后两个参数将作为 argv[0]
(这是 shell 本身的名称)和 argv[1]
传递给脚本,第一个参数将被替换为 $@
.
我想创建一个带有 cmdline 可指定退出代码的 docker 图像。
从这个问题中,我了解到我必须使用 exit
作为 sh
的参数,因为它是 shell 内置命令,而不是可执行文件:
即我可以创建一个 docker 容器,它以错误代码 42 退出,如下所示:
# 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 容器设为 return 指定为 cmdline 参数的退出代码?
例如。这可能吗:
$ 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
...我希望带有 ENTRYPOINT ["sh", "-c", "exit"]
和 CMD ["0"]
的 Dockerfile 会产生前者,但我认为它会产生后者——是吗?
您的所有 docker 运行 参数都将传递给您的 entrypoint.sh
如果您定义了一个参数。
例如在我的 Dockerfile 中我有:
# prepare container
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
在我的 entrypoint.sh
printf "Custom exit code '$*'\n"
exit "$@"
然后只是 运行 和 args:
$ docker run verify 129
Custom exit code '129'
$ echo $?
129
$ _
你是对的,CMD
总是将其内容作为新参数传递给入口点。您不能将其作为 ENTRYPOINT
.
我还推荐 Florin 的解决方案,即自定义入口点。但是,如果你真的需要,你仍然可以只使用 shell 来完成:
from alpine
entrypoint ["/bin/sh", "-c", "exit \"$@\"", "sh"]
cmd ["42"]
这将 运行 sh
有 4 个参数,分别是 -c
、exit "$@"
、sh
和 42
(或您的命令) .最后两个参数将作为 argv[0]
(这是 shell 本身的名称)和 argv[1]
传递给脚本,第一个参数将被替换为 $@
.