如何让我的 docker 映像将 apache 作为服务运行

Aid*_*wen 1 apache docker dockerfile docker-compose

我已经构建了一个 docker 映像来运行 apache。我从 ubuntu 基础镜像构建了它,这样我就可以设置我想要的 apache 和 php 版本。CMD我在 docker 文件末尾添加了 a以在前台运行 apache。

FROM ubuntu:16.04

RUN apt-get update && \
    apt-get install -y --allow-unauthenticated software-properties-common && \
    add-apt-repository ppa:ondrej/apache2 && \
    apt-get update && \

    ....

WORKDIR /

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 docker-compose (以及其他一些服务)运行容器。但是容器会立即退出。如果使用命令运行图像,也会发生同样的情况docker

docker run my_image
docker ps
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我使用 运行它docker run -it my_image,那么容器就会启动,并且我会进入 bash shell。(我相信我正在使用的 ubuntu 基础映像上的默认 CMD 是 bash)。

我错过了什么吗?如何编写 Dockerfile 以便 apache 作为映像上的服务运行?

pro*_*erq 5

如果您在运行图像时收到 bash shell,则听起来您的命令CMD ["/usr/sbin/apachectl","-DFOREGROUND"]没有生效。

仔细检查您的docker build命令是否成功,并且您正在运行构建的映像而不是其他映像。

下面是一个示例 Dockerfile、相关docker build输出(特别是CMD步骤)及其运行示例:

$ cat Dockerfile
FROM ubuntu:16.04
RUN apt-get -y update && apt-get -y install apache2 && rm -rf /var/lib/apt/lists/*

CMD apachectl -DFOREGROUND
$ docker build -t myapache .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:16.04
 ---> 2fa927b5cdd3
Step 2 : RUN apt-get -y update && apt-get -y install apache2 && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> f766fd84056d
Step 3 : CMD apachectl -DFOREGROUND
 ---> Running in 2814d231e50e
 ---> 774b579e43ce
Removing intermediate container 2814d231e50e
Successfully built 774b579e43ce
$ r run -d --name myapache -p 80:80 myapache
4718994f1669306c64ac6846f4e0f87aa15a63a888ca7d5c8ba711f39379db57
$ http://localhost:80/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu
    Last updated: 2014-03-19
    See: https://launchpad.net/bugs/1288690
...
Run Code Online (Sandbox Code Playgroud)