【问题标题】:Docker CentOS image does not auto start httpdDocker CentOS 映像不会自动启动 httpd
【发布时间】:2014-02-12 08:21:35
【问题描述】:

我正在尝试使用 Apache 和 PHP 程序运行一个简单的 Docker 映像。如果我运行它会正常工作

docker run -t -i -p 80:80 my/httpd /bin/bash

然后手动启动Apache

service httpd start

但是我不能让 httpd 在运行时自动启动

docker run -d -p 80:80 my/httpd

Apache 将启动,然后容器存在。我在我的 docker 文件中尝试了一堆不同的CMDs

CMD /etc/init.d/httpd start
CMD ["service" "httpd" "start"]
CMD ["/bin/bash", "/etc/init.d/httpd start"]
ENTRYPOINT /etc/init.d/httpd CMD start
CMD ./start.sh

start.sh 是

#!/bin/bash
/etc/init.d/httpd start

但是每次 docker 实例在 apache 启动后都会存在

我是否遗漏了一些非常明显的东西?

【问题讨论】:

    标签: apache docker centos dockerfile


    【解决方案1】:

    你需要直接运行 apache (httpd) - 你不应该使用 init.d 脚本。

    两种选择:

    1. 您必须在前台运行 apache:/usr/sbin/apache2 -DFOREGROUND ...(或 CentOS 中的 /usr/sbin/httpd)
    2. 您必须通过执行/sbin/init 作为入口点来启动所有服务(包括配置为自动运行的apache)。

    【讨论】:

    • 谢谢吉里!使用 ENTRYPOINT ["/usr/sbin/httpd"]CMD ["-D", "FOREGROUND"] 是一种享受
    • 仅供参考,有些人还运行:/sbin/some_deamon && tail -f /var/log/foo
    • @ØyvindSkaar && tail -f ... 是一个不错的 hack,但请注意它会在日志轮换事件中退出容器,所以我不建议将它用于像 /var/log/apache2/access.log 这样的日志文件
    • 感谢 ØyvindSkaar,虽然 Jiri 的方法非常适合 httpd,但我将您的示例用于不同的 tigase 容器。效果很好。
    • 也关于尾随日志文件;可能没有 logrotate (也没有 cron 来运行它),所以你的磁盘会充满日志。使用 CustomLog 的管道日志功能会更好。看看httpd自带的rotatelogs(8)
    【解决方案2】:

    在centOS上运行httpd的简单Dockerfile

    FROM centos:latest
    RUN yum update -y
    RUN yum install httpd -y
    ENTRYPOINT ["/usr/sbin/httpd","-D","FOREGROUND"]
    

    构建镜像和运行容器的命令

    构建

    docker build . -t chttpd:latest
    

    使用新镜像运行容器

    docker container run  -d -p 8000:80 chttpd:latest
    

    【讨论】:

      【解决方案3】:

      Dockerfile 的底部添加这一行,以便在 CentOS 的前台运行 Apache

      ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]
      

      【讨论】:

        猜你喜欢
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        相关资源
        最近更新 更多