17

我尝试使用入口点和 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 命令

4

3 回答 3

42

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

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

相当于运行:

ENTRYPOINT["/start.sh", "aptly", "api", "serve"]
于 2017-12-05T09:19:01.707 回答
4

如果不知道入口点的作用,就不能说太多,但本质上这就是你使用入口点和 cmd 的组合所做的事情:

/start.sh aptly api serve

如果您只是在启动服务器之后,您可以简单地执行以下操作(aptly可能需要有效的可执行文件路径):

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

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

于 2017-12-05T08:19:12.487 回答
2

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

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

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

于 2021-03-11T23:34:39.573 回答