我正在构建一个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"]
答案 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部分。