如果我有一个结尾为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}}命令行提示符?
答案 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