我已经构建了一个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作为服务在图像上运行?
答案 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
...