“service nginx start”命令在交互模式下成功,在 Dockerfile 中失败

“service nginx start”命令在交互模式下成功,在 Dockerfile 中失败

主机操作系统:macOS Mojave

我正在为 Nginx 构建一个简单的 Docker 容器。nginx 将在交互模式下正确启动,但在通过 Dockerfile 中的 RUN 命令调用时会静默失败。

Dockerfile:

来自 Ubuntu:18.04

运行 apt-get update && \ apt-get -y install nginx net-tools

工作目录 /etc/nginx

复制 nginx.conf ./nginx.conf

运行服务 nginx 启动

命令 /bin/bash

启动脚本及问题复制:

$ docker build -t blog_nginx . && docker run -it blog_nginx

Sending build context to Docker daemon  62.46kB

Step 1/6 : FROM ubuntu:18.04
 ---> 94e814e2efa8

Step 2/6 : RUN apt-get update &&    apt-get -y install nginx net-tools
 ---> Using cache
 ---> 18300d884828

Step 3/6 : WORKDIR /etc/nginx
 ---> Using cache
 ---> 22da684cd328

Step 4/6 : COPY nginx.conf ./nginx.conf
 ---> Using cache
 ---> 76624c016191

Step 5/6 : RUN service nginx start
 ---> Using cache
 ---> 0987fab7a011

Step 6/6 : CMD /bin/bash
 ---> Using cache
 ---> 7bdce4aa6802

Successfully built 7bdce4aa6802

Successfully tagged blog_nginx:latest

root@846f4e47e369:/etc/nginx# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 01:15 pts/0    00:00:00 /bin/sh -c /bin/bash

root         6     1  0 01:15 pts/0    00:00:00 /bin/bash

root        11     6  0 01:15 pts/0    00:00:00 ps -ef

root@846f4e47e369:/etc/nginx# service nginx start

 * Starting nginx nginx                                                                                       

root@846f4e47e369:/etc/nginx# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 01:15 pts/0    00:00:00 /bin/sh -c /bin/bash

root         6     1  0 01:15 pts/0    00:00:00 /bin/bash

root        31     1  0 01:15 ?        00:00:00 nginx: master process /usr/sbin/nginx

nobody      32    31  0 01:15 ?        00:00:00 nginx: worker process

root        34     6  0 01:16 pts/0    00:00:00 ps -ef

答案1

一个RUN命令内的所有内容都被隔离并在临时容器内执行。

每个 Dockerfile 指令都docker build在临时容器中执行。一旦指令完成,临时容器就会停止,其中运行的所有内容都会被终止。

这就是为什么您不会在下一个RUN指令中运行 nginx 实例。您可以通过在一个命令中运行两个指令来实现这一点:

RUN service nginx start && ps -ef

一旦docker build完成,图像内就没有任何内容在运行。新的进程将以 开始docker run ...,您需要通过定义ENTRYPOINT或来决定如何启动它CMD

相关内容