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 命令
如果不知道入口点的作用,就不能说太多,但本质上这就是您使用入口点和 cmd 的组合所做的事情:
/start.sh aptly api serve
如果你只是在启动你的服务器之后,你可以简单地做这样的事情(aptly
可执行文件的有效路径可能是必需的):
ENTRYPOINT ["aptly"]
CMD ["api", "serve"]
除非你做的不仅仅是 运行 一个可执行文件,否则不需要入口点。
当您同时使用入口点和命令时,命令部分将作为参数附加到入口点可执行文件。因此在你的情况下:
ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]
相当于运行:
ENTRYPOINT["/start.sh", "aptly", "api", "serve"]
一个重要的注意事项,因为没有其他人提到它:为了一起使用 ENTRYPOINT
和 CMD
,您需要以数组格式指定两者。这样做 不会起作用:
ENTRYPOINT ./my_script.sh
CMD echo "hello world"
上面的代码中会调用./my_script.sh
,但是不会传入CMD
我尝试使用入口点和 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 命令
如果不知道入口点的作用,就不能说太多,但本质上这就是您使用入口点和 cmd 的组合所做的事情:
/start.sh aptly api serve
如果你只是在启动你的服务器之后,你可以简单地做这样的事情(aptly
可执行文件的有效路径可能是必需的):
ENTRYPOINT ["aptly"]
CMD ["api", "serve"]
除非你做的不仅仅是 运行 一个可执行文件,否则不需要入口点。
当您同时使用入口点和命令时,命令部分将作为参数附加到入口点可执行文件。因此在你的情况下:
ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]
相当于运行:
ENTRYPOINT["/start.sh", "aptly", "api", "serve"]
一个重要的注意事项,因为没有其他人提到它:为了一起使用 ENTRYPOINT
和 CMD
,您需要以数组格式指定两者。这样做 不会起作用:
ENTRYPOINT ./my_script.sh
CMD echo "hello world"
上面的代码中会调用./my_script.sh
,但是不会传入CMD