Использование официального образа php docker и запуск memcached при запуске

У меня есть файл Docker, который я основываю на образе php: 5.5.36-apache, для создания образа специально для разработки. Мой 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: Джесси

0

Решение

php: 5.5.36-apache имеет скрипт bash под названием apache2-foreground, который использует exec чтобы запустить Apache, этот скрипт вызывается с CMD ["apache2-foreground"] в конце Dockerfile. Это один сценарий, который будет выполняться Docker при запуске и exec команда передает выполнение в систему.

Мое решение, которое мне очень нехорошо, и я бы не советовал делать это с любыми рабочими серверами, это скопировать apache2-foreground скрипт и запуск memcached перед запуском apache. Поскольку это образ для использования в качестве локального сервера разработки, это отвечает моим потребностям.

Обновленный apache2-foreground:
#! / Bin / Баш
установить -е

# 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/
0

Другие решения

Эта ссылка работала для меня по той же проблеме с php5, apache2 и memcached в Dockerfile, основанном на Ubuntu:

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/

0