在Dockerfile

时间:2016-04-19 21:39:05

标签: apache docker

我正在构建一个Docker容器,在这个容器中我正在下载Apache服务。是否可以在某个时刻自动启动Apache服务? Systemctl启动httpd在Dockerfile中不起作用。

基本上,我希望在启动docker容器时启动apache服务。

FROM centos:7
MAINTAINER me <me@me.com>
RUN yum update -y && yum install -y httpd php
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
EXPOSE 80
EXPOSE 443
CMD ["/usr/sbin/init"]

2 个答案:

答案 0 :(得分:2)

尝试使用CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

您也可以运行:

docker run -d <image name> /usr/sbin/httpd -DFOREGROUND

答案 1 :(得分:2)

根据Docker引用(Entrypoint reference),在您描述的场景中,您将使用ENTRYPOINT,因为您希望您的Web服务器不可避免地&#34;开始。 CMD适用于您可能更改/被覆盖的命令或命令行选项:

  

docker run的命令行参数将附加在exec中的所有元素形成ENTRYPOINT之后,并将覆盖使用CMD指定的所有元素。这允许将参数传递给入口点,即docker run -d将-d参数传递给入口点。

如果您必须覆盖ENTRYPOINT,例如对于测试/诊断,请使用特定的--entrypoint选项。

此外:

  

您可以使用ENTRYPOINT的exec形式设置相当稳定的默认命令和参数,然后使用任一形式的CMD设置更有可能更改的其他默认值。

因此,ENTRYPOINT用于固定服务/应用程序部分,CMD用于可重写命令或选项。

使用 ENTRYPOINT和CMD可以设置&#34;固定&#34;命令部分(包括选项)和&#34;变量&#34;部分。像这样:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

这意味着,在您的情况下,您可能会考虑:

ENTRYPOINT ["/usr/sbin/httpd"] 
CMD ["-DFOREGROUND"]

允许你这样做:

docker run -d <image name>

当您想在前台运行Web服务器时,

docker run -d <image name> -DBACKGROUND

如果您希望使用-DBACKGROUND选项运行相同的服务器,只覆盖-DFOREGROUND部分。