Dockerfile中CMD和ENTRYPOINT紧随其后的问题

时间:2019-02-27 13:23:49

标签: docker dockerfile quorum docker-run

我有一个看起来像这样的Dockerfile:

FROM quorumengineering/quorum:latest

RUN apk add nodejs npm
RUN cd ~
RUN npm i axios
COPY watcher.js .
ENTRYPOINT [ "geth", "--raft", "--raftjoinexisting", "1" ]
CMD "node watcher.js"

我要实现的目标是使用参数运行geth,然后运行nodejs应用watcher.js

使用以下命令正确构建容器映像:

docker build -t somename .

使用以下命令可以正常启动:

docker run -d somename

但是当我docker exec -it containerID sh并运行ps时,我得到了:

/ # ps
PID   USER     TIME  COMMAND
    1 root      0:01 geth --raft --raftjoinexisting 1 /bin/sh -c "node watcher.js"
   16 root      0:00 sh
   23 root      0:00 ps

看起来好像正在一行中运行两个命令... geth命令运行得很好,但是nodejs应用未启动... docker logs没有给我任何有趣的输出。

1 个答案:

答案 0 :(得分:2)

Entrypoint设置运行容器时将首先执行的命令和参数。

CMD在执行容器时提供默认值。这些将在入口点之后执行。

Docker建议使用ENTRYPOINT设置映像的主命令,然后使用CMD作为默认标志。这是一个使用这两个指令的示例Dockerfile。

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

我建议您使用所需的启动命令创建bash脚本,将其添加到容器中,然后在CMD或ENTRYPOINT中使用它。