主机操作系统: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
。