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

时间:2016-10-13 16:50:40

标签: apache docker docker-compose dockerfile

我已经构建了一个docker镜像来运行apache。我已经从ubuntu基础映像构建它,以便我可以设置我想要的apache和php版本。我在docker文件的末尾添加了CMD,以便在前台运行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"]

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

docker run my_image
docker ps

有趣的是,如果我用docker run -it my_image运行它,那么容器就会启动,我就会被带入一个bash shell。 (我相信我使用的ubuntu基本图像上的默认CMD是bash)。

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

1 个答案:

答案 0 :(得分:3)

如果您在运行图片时获得了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
...