【问题标题】:Using the official php docker image and running memcached on start使用官方 php docker 镜像并在启动时运行 memcached
【发布时间】:2016-11-28 23:31:24
【问题描述】:

我有一个基于 php:5.5.36-apache 映像的 docker 文件,用于专门为开发创建映像。我的 Dockerfile 安装了 memcached,但我没有运气让 memcached 在启动时启动。如果我 ssh 进入容器并手动启动 memcached,它就可以正常启动。

FROM php:5.5.36-apache

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    default-jdk 
RUN apt-get install -y --no-install-recommends autoconf    
RUN apt-get install -y --no-install-recommends python python-pip

RUN apt-get update && apt-get install -y libmemcached-dev \
    apt-utils re2c g++ memcached \
    zlib1g zlib1g-dbg zlib1g-dev zlibc mysql-client php5-mysql \
    && pecl install memcached \
    && docker-php-ext-enable memcached\
    && pecl install memcache \
    && docker-php-ext-enable memcache

RUN docker-php-ext-install pdo pdo_mysql

RUN apt-get install -y gettext

RUN pip install hgapi

RUN a2enmod headers \
    && a2enmod rewrite

COPY ./apache2.conf /etc/apache2/apache2.conf

RUN mkdir /var/www/content

EXPOSE 11211

RUN systemctl enable memcached.service

基础镜像基于 debian:jessie

【问题讨论】:

  • 你误用了 RUN。 RUN 帮助你安装和配置你需要的软件,ADD/COPY 添加文件,ENV 定义你的环境变量,CMD 和 ENTRYPOINT 启动你的东西,所以它们在 Mysql docker 镜像中启动 mysqld,在 Apache docker 镜像中启动 apache 等等。我在您的 Dockerfile 中没有看到 CMD 或 ENTRYPOINT。检查文档 docs.docker.com/engine/reference/builder/#/cmddocs.docker.com/engine/reference/builder/#/entrypoint
  • 我开始的图像有一个启动 apache 的 CMD,这确实是让我感到困惑的部分。请看下面我的回答,我现在好多了。

标签: php docker debian memcached boot


【解决方案1】:

此链接适用于我在基于 ubuntu 的 Dockerfile 中与 php5、apache2 和 memcached 相同的问题:

https://github.com/moby/moby/issues/5137

安装主管

RUN apt-get install -y supervisor

并在 Dockerfile 中进行配置:

RUN touch  /etc/supervisor/conf.d/supervisord.conf && \
    echo "[supervisord]" >> /etc/supervisor/conf.d/supervisord.conf && \
    echo "nodaemon=true" >> /etc/supervisor/conf.d/supervisord.conf

RUN touch /etc/supervisor/conf.d/memcached.conf && \
    echo "[program:memcache]" >> /etc/supervisor/conf.d/memcached.conf && \
    echo "command=/usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -DFOREGROUND" >> /etc/supervisor/conf.d/memcached.conf && \
    echo "autostart=true" >> /etc/supervisor/conf.d/memcached.conf && \
    echo "autorestart=true" >> /etc/supervisor/conf.d/memcached.conf

RUN touch /etc/supervisor/conf.d/apache2.conf && \
    echo "[program:apache2]" >> /etc/supervisor/conf.d/apache2.conf && \
    echo 'command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"' >> /etc/supervisor/conf.d/apache2.conf && \
    echo "autostart=true" >> /etc/supervisor/conf.d/apache2.conf && \
    echo "autorestart=true" >> /etc/supervisor/conf.d/apache2.conf

CMD ["/usr/bin/supervisord"]

此链接还解释了如何在一个容器中运行多个服务:

https://docs.docker.com/engine/admin/multi-service_container/

【讨论】:

    【解决方案2】:

    php:5.5.36-apache 有一个名为 apache2-foreground 的 bash 脚本,它使用 exec 来启动 apache,该脚本在 Dockerfile 的末尾使用 CMD ["apache2-foreground"] 调用。这是 Docker 在启动时将执行的一个脚本,exec 命令将执行传递给系统。

    我的解决方案很不优雅,我不建议对任何类型的生产服务器执行此操作是复制 apache2-foreground 脚本并在启动 apache 之前启动 memcached。由于这是用作本地开发服务器的图像,因此可以满足我的需求。

    更新后的apache2-foreground: #!/bin/bash 设置-e

    # Apache gets grumpy about PID files pre-existing
    rm -f /var/run/apache2/apache2.pid
    
    /etc/init.d/memcached start
    exec apache2 -DFOREGROUND
    

    然后我换了:

    RUN systemctl enable memcached.service
    

    与:

    COPY apache2-foreground /usr/local/bin/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2020-11-25
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多