我尝试使用接受参数的脚本执行来覆盖docker
映像中的入口点,失败如下
▶ docker run --entrypoint "/bin/sh -c 'my-script.sh arg1 arg2'" my-image:latest
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/sh -c 'myscript.sh arg1 arg2'": stat /bin/sh -c 'my-script.sh arg1 arg2': no such file or directory: unknown.
然而,当我执行到容器时,上面的命令成功了:
▶ docker run --entrypoint sh -it my-image:latest
~ $ /bin/sh -c 'my-script.sh arg1 arg2'
Success
我在语法中遗漏了什么吗?
3条答案
按热度按时间fcwjkofz1#
请记住,容器镜像名称后面的参数只是传递给ENTRYPOINT脚本。因此,您可以编写:
例如,如果我有
my-script.sh
(mode0755
),其中包含:Dockerfile是这样的:
我可以跑:
并得到输出:
如果你想运行任意序列的shell命令,你当然可以这样做:
tjvv9vkg2#
如果你需要经常这样做,你可以重构你的Dockerfile,让它更容易做到。
Docker容器的主进程是通过连接“entrypoint”和“command”参数列表来运行的。在Dockerfile中,这些参数来自
ENTRYPOINT
和CMD
指令。在docker run
命令中,这更棘手:在图像名称之后的任何内容都是“命令”部分,但是“入口点”部分需要由--entrypoint
参数提供,它需要在图像名称之前,并且它只能是单个单词。如果你需要定期替换命令,如果你在Dockerfile中使用
CMD
而不是ENTRYPOINT
来设置它,语法会变得更清晰。如果您进行了此更改,那么您可以将备用命令放在
docker run
命令中的图像名称之后,而无需--entrypoint
选项,也无需将命令字符串拆分为图像名称。我将推荐一种模式,其中
ENTRYPOINT
是一个 Package 器脚本,它进行一些首次设置,然后执行类似exec "$@"
的操作来运行作为参数传递给它的命令。该设置与CMD
优先方法兼容:入口点 Package 器将执行其设置,然后运行覆盖命令而不是图像的命令。bttbmeg03#
不太好,但这对我来说很有效。docker run image“/bin/bash”“-c”“source ~/.bashrc && /bin/bash”