具有入口点变量扩展和CMD参数的Docker容器

feo*_*eob 18 docker dockerfile docker-image docker-container

我想创建一个Docker Image作为可执行文件,用户将令牌作为环境变量传递给它.可执行文件具有用户应通过docker CMD传递的子命令(通过Env考虑git和身份验证).但是,Docker不会将CMD附加到入口点.我的Dockerfile的相关部分如下所示:

ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"]
CMD ["pull", "stuff"]
Run Code Online (Sandbox Code Playgroud)

因此,如果此容器在没有任何CMD覆盖的情况下执行,并且secret作为MY_TOKEN变量,我会期望

mycmd --token=secret pull stuff
Run Code Online (Sandbox Code Playgroud)

被执行.如果用户使用覆盖启动容器,例如

docker run -it -e MY_TOKEN=secret myimage push junk
Run Code Online (Sandbox Code Playgroud)

我期待

mycmd --token=secret push junk
Run Code Online (Sandbox Code Playgroud)

被执行.但是,如上所述,只有mycmd --token=secret执行,CMD才会被忽略 - 无论我是在启动时覆盖它还是在Dockerfile中设置它.

BMi*_*tch 12

使用/bin/sh -c "script"语法,-c参数后面的任何内容都会成为脚本的参数.您可以联系他们$0,并$@为你的/ bin/sh的脚本的一部分:

ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 $@"]
CMD ["pull", "stuff"]
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以将入口点更改为添加到映像的exec /usr/bin/mycmd --token=$MY_TOKEN "$@"shell脚本,该脚本使用docker的exec语法运行并执行该shell脚本:

ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

  • 使用`/ entrypoint.sh`和exec的+1.有一点需要注意:你应该引用`$ @`,例如:`exec/usr/bin/mycmd --token = $ MY_TOKEN"$ @"`.否则,在参数中遇到空格时,您可能会遇到奇怪的行为. (4认同)
  • 我已经更新了我的命令,在/ usr/bin/mycmd之前使用"exec"来删除作为pid 1运行的额外shell脚本. (2认同)

Dav*_*uiz 7

正如docker文档中所指定的那样,您指定了一个调用shell的入口点(因此不是shell形式,而是exec形式).参数传递给shell(因此被忽略); 只有shell中的命令很重要.切换入口点调用后,您将看到问题已解决:

ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]

在入口点调用shell是非常不鼓励的,并且只有在您希望避免图像用户将自定义参数附加到入口点时才会有用.

在互联网上见!:)

  • 这不起作用,因为在exec形式中,没有扩展环境变量:`docker:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致"exec:\"/ usr/bin/mycmd --token = $ MY_TOKEN \":stat/usr/bin/mycmd --token = $ MY_TOKEN:没有这样的文件或目录".` (2认同)