提问人:Vana 提问时间:12/5/2017 最后编辑:Vana 更新时间:11/15/2022 访问量:30232
Docker 入口点和 cmd 一起使用
Docker entrypoint and cmd together
问:
我尝试使用入口点和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 命令
答:
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
一个重要的注意事项,因为没有人提到它:为了一起使用和一起使用,您需要以数组格式指定两者。做这样的事情是行不通的:ENTRYPOINT
CMD
ENTRYPOINT ./my_script.sh
CMD echo "hello world"
在上面的代码中,将被调用,但不会被传入。./my_script.sh
CMD
评论
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"]
评论