Docker 入口点和 cmd 一起使用

Docker entrypoint and cmd together

提问人:Vana 提问时间:12/5/2017 最后编辑:Vana 更新时间:11/15/2022 访问量:30232

问:

我尝试使用入口点和cmd设置Docker。

FROM debian:stretch
RUN apt-get update && \
apt install gnupg ca-certificates -y 
RUN echo "deb http://repo.aptly.info/ squeeze main" > /etc/apt/sources.list.d/aptly.list
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys 9E3E53F19C7DE460
RUN apt update && apt install aptly -y
ADD aptly.conf /etc/aptly.conf
ADD start.sh .
VOLUME ["/aptly"]
ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

但是入口点脚本并没有停止...... cmd 命令未启动

这是我的脚本:

#!/bin/bash
 set -e 
 init_aptly() { 
 #import pgp key
#create nginx root folder in /aptly
su -c "mkdir -p /aptly/.aptly/public"
echo "12"
 #initialize repository
 #aptly create repo doze-server -   distribution="stable"
  }
  #check for first run
 if [ ! -e /aptly/.aptly/public ]; then
  init_aptly
  echo "13"
 fi
  echo "14"

脚本总是回显 14,我只想要一个,然后从 dockerfile 执行 cmd 命令

docker cmd docker入口点

评论


答:

6赞 Mike Doe 12/5/2017 #1

在不知道入口点做什么的情况下,无法说出太多,但本质上这就是您使用入口点和 cmd 的组合所做的:

/start.sh aptly api serve

如果你只是在启动你的服务器之后,你可以简单地做这样的事情(可能需要可执行文件的有效路径):aptly

ENTRYPOINT ["aptly"]
CMD ["api", "serve"]

除非你做的不仅仅是运行一个可执行文件,否则不需要入口点。

评论

1赞 Vana 12/5/2017
不需要cmd,只需要ENTRYPOINT [/start.sh aptly api serve]?
0赞 Mike Doe 12/5/2017
对不起,我不明白你的问题。
68赞 yamenk 12/5/2017 #2

当您同时使用入口点和命令时,命令部分将作为参数附加到入口点可执行文件中。因此,在您的情况下:

ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

相当于运行:

ENTRYPOINT["/start.sh", "aptly", "api", "serve"]

评论

0赞 yamenk 12/5/2017
您可以像 bash 脚本一样组合可执行文件CMD ./start.sh && aptly api serve
17赞 George Pligoropoulos 4/28/2018
这当然是很直观的。对像这样实现它的人有强烈的负面情绪!
3赞 rj487 6/7/2019
即使在 2019 年,这也拯救了我
1赞 Marinos An 11/15/2022
有什么理由更喜欢第一种语法而不是第二种语法吗?例如,它是否会影响命令覆盖(在运行容器时)的应用方式?
1赞 andy 5/6/2023
@ADJenks docker 参考中的 Entrypoint 示例 (docs.docker.com/engine/reference/builder/...)
24赞 Jeremy Blalock 3/12/2021 #3

一个重要的注意事项,因为没有人提到它:为了一起使用和一起使用,您需要以数组格式指定两者。做这样的事情是行不通的:ENTRYPOINTCMD

ENTRYPOINT ./my_script.sh
CMD echo "hello world"

在上面的代码中,将被调用,但不会被传入。./my_script.shCMD

评论

3赞 benjaminchanming 12/8/2021
谢谢,您使我免于数小时的调试!
1赞 Marinos An 11/15/2022 #4

以下将允许将 entrypoint 的默认参数(在 CMD 中提供)替换为 中提供的参数。docker run

ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

下面会将提供的参数追加到最后一个参数之后的入口点。为了立即覆盖入口点及其参数,您需要显式使用标志:docker run--entrypoint

ENTRYPOINT["/start.sh", "aptly", "api", "serve"]