Docker在Dockerfile中定义了多个默认命令

时间:2018-11-04 21:11:53

标签: docker command-line-interface gulp-watch docker-run

如果我有一个结尾为Docker的文件:

ENTRYPOINT /bin/bash

并通过docker run运行容器,然后在终端中键入

gulp

这使我可以大吃一惊,可以轻松地以Ctrl+C终止

但是当我以这种方式将gulp作为默认命令添加到Dockerfile时:

CMD ["/bin/bash", "-c", "gulp"]

或者这个:

ENTRYPOINT ["/bin/bash", "-c", "gulp"]

然后,当我通过docker run运行容器时,gulp正在运行,但无法通过Ctrl+C热键终止它。

我用来构建映像的Dockerfile:

FROM node:8

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y libltdl-dev

WORKDIR /home/workspace

RUN npm install gulp -g

#works but cant kill gulp with Ctrl+C
#CMD ["/bin/bash", "-c", "gulp"]

#works but cant kill gulp with Ctrl+C
#ENTRYPOINT ["/bin/bash", "-c", "gulp"]

# need to type command gulp in cli to run it
# but I'm able to terminate gulp with Ctrl+C
ENTRYPOINT /bin/bash

对于我来说,我不能终止Dockerfile中定义的容器的默认命令,因为一旦终止默认值,将没有其他命令可以运行。

如何在Dockerfile中声明要默认运行/bin/bash并在gulp之上运行,所以如果终止gulp,我将切换回{{ 1}}命令行提示符?

2 个答案:

答案 0 :(得分:0)

由于gulp是一种构建工具,因此通常在构建容器的过程中运行它,而不是在启动容器时运行它。您的Dockerfile可能看起来像

FROM node:8
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
COPY . ./
RUN gulp
CMD yarn run start

运行docker build时,它将打印出类似的内容

---> b35f4035db3f
Step 6/7 : RUN gulp
---> Running in 02071fceb21b

重要的是,在每个步骤(每个Dockerfile命令之前的行)中打印出的最后一个十六进制字符串是有效的Docker映像ID。如果您的构建出错,则可以

host$ sudo docker run --rm -it b35f4035db3f bash
root@38ed4261ab0f:/app# gulp

完成问题调试后,您可以检查源代码控制系统中的所有修复程序,并在以后根据需要重建映像。

答案 1 :(得分:0)

Gulp是您需要使用run命令安装的构建工具。这会将更改提交到基本映像的顶部。
如果要在dockerfile中使用ENTRYPOINT或CMD将其用作默认命令,则绝对不能使用ctrl + c杀死它,因为它不是Shell进程,而是实际上您正在运行的容器。< br /> 如果万一您有dockerfile,请输入ENTRYPOINT。您可以使用docker stop停止容器。

注意:无法使用ctrl + c杀死容器,需要通过以下方式将其停止:
docker stop container_name