如何在Dockerfile中运行两个命令?

11

我需要在 Dockerfile 中执行两个命令,但这两个命令都与终端相关联,并会阻止后续命令的执行。

Dockerfile:

FROM sinet/nginx-node:latest

RUN mkdir /usr/src/app

WORKDIR /usr/src/app

RUN git clone https://name:pass@bitbucket.org/joaocromg/front-web-alferes.git
WORKDIR /usr/src/app/front-web-alferes

RUN npm install 
    
RUN npm install bower -g 
RUN npm install gulp -g 
RUN bower install --allow-root 
    
COPY default.conf /etc/nginx/conf.d/

RUN nginx -g 'daemon off;' & # command 1 blocking
 
CMD ["gulp watch-dev"] # command 2 not executed

有人知道我该怎么解决这个问题吗?


尝试使用 && 连接它们。 - arnonuem
我尝试了但是没有成功。:\ - Paulo
2
可能是在Alpine上运行nginx的重复问题 - Efrat Levitan
这个问题的通常答案是“在两个独立的容器中”;有一个标准的 nginx 镜像可以帮助你运行那部分。 - David Maze
@DavidMaze 我知道标准是分成两个容器,但在我的情况下没有意义(我不开发这个系统,我只是尝试使用容器)。因为“gulp watch-dev”仅用于管理静态文件,而不是不同的服务。 - Paulo
3个回答

15

尝试创建像这样的脚本:

#!/bin/sh
nginx -g 'daemon off;' & 
gulp watch-dev

然后在你的CMD中执行它:

CMD /bin/my-script.sh

另外,请注意你的最后一行是无效的:

CMD ["gulp watch-dev"]

需要是以下两种情况之一:

CMD gulp watch-dev

或:
CMD ["gulp", "watch-dev"]

另外,请注意,RUN 用于执行将更改镜像状态的命令(例如RUN apt install curl),而不是用于在运行容器时需要运行的程序。参考文档

RUN 指令将在当前镜像的顶部创建一个新层,并执行其中的任何命令,然后提交结果。生成的提交镜像将用于Dockerfile中的下一步。


2

1
这里的答案是,RUN nginx -g 'daemon off;'有意将nginx在前台启动,这会阻塞第二个命令。此命令旨在以此为前台进程启动docker容器。运行RUN nginx将启动nginx,创建主节点和子节点,并(希望)以零状态代码退出。尽管如上所述,这不是run的预期用途,因此在这种情况下最好使用bash脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接