【问题标题】:How to run two commands on Dockerfile?如何在 Dockerfile 上运行两个命令?
【发布时间】:2019-12-01 19:14:30
【问题描述】:

我必须在 docker 文件上执行两个命令,但是这两个命令都连接到终端并阻止了下一个命令的执行。

码头文件:

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

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 尝试用 && 连接它们
  • 我试过了,但是不行。 :\
  • Running nginx on Alpine的可能重复
  • 这个问题的通常答案是“在两个单独的容器中”;有一个标准的nginx 图像可以帮助您运行该部分。
  • @DavidMaze 我知道标准在两个容器中是分开的,但在我的情况下没有意义(我不开发这个系统,我只是在尝试使用容器)。因为“gulp watch-dev”只是用于管理静态文件而不是不同的服务。

标签: docker nginx gulp docker-compose dockerfile


【解决方案1】:

尝试创建这样的脚本:

#!/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),而不是用于执行运行容器时需要运行的程序。来自docs

RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile 中的下一步。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我建议您在这种情况下尝试使用 supervisord。 http://supervisord.org/

      编辑:这是 httpd 和 ssh 守护进程的 dockerized 示例:https://riptutorial.com/docker/example/14132/dockerfile-plus-supervisord-conf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        相关资源
        最近更新 更多