0

如果我有一个最后的 Docker 文件:

ENTRYPOINT /bin/bash

docker run并通过终端运行容器并输入

gulp

这让我可以运行 gulp,我可以很容易地终止Ctrl+C

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

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

或这个:

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

docker run然后当我通过is running运行容器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,我将切换回bash命令行提示符?

4

2 回答 2

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

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

于 2018-11-04T23:32:47.207 回答
0

Gulp 是您需要使用运行命令安装的构建工具。这将在您的基础映像之上提交更改。
如果您想在 dockerfile 中使用 ENTRYPOINT 或 CMD 将其用作默认命令,那么您绝对不能使用 ctrl+c 杀死它,因为它不是 shell 进程,而是实际上是您正在运行的容器。
如果你有你的 dockerfile 一个 ENTRYPOINT。您可以使用 docker stop 停止容器。

注意:不能使用 ctrl+c 杀死容器,它需要通过以下方式停止:
docker stop container_name

于 2018-11-05T02:54:29.843 回答