Apache не запускается автоматически при создании докера

Dockerfile

FROM phusion/baseimage:0.9.16
MAINTAINER Raheel <raheelwp@gmail.com>

# Apache
RUN apt-get update
RUN apt-get -y install apache2

# PHP
RUN apt-get -y install python-software-properties
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get -y install php7.0
RUN apt-get -y install libapache2-mod-php7.0 php7.0-curl php7.0-json

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

докер-composer.yaml

version: '2'
services:
frontend:
build: ./frontend
ports:
- "80:80"volumes:
- ./frontend:/var/www/html/frontend

Я пытаюсь запустить приложение laravel в докере. Я сталкиваюсь с двумя проблемами

1 — Когда я запускаю docker-compose, сервер apache внутри контейнера не запускается автоматически. Каждый раз, когда я должен войти в контейнер и сделать service apache2 start, Согласно моему поиску, я нашел команду CMD, которую я написал в Dockerfile, это то, как мы запускаем apache, но не работаем в моем случае

2 — Когда я вхожу в контейнер и захожу в папку с моим приложением /var/www/html/frontend его пользователь 1000: 1000 что-то. Я хочу, чтобы они были под www-data: www-data. Но я не хочу, чтобы это было добавлено в мой Dockerfile, так как я хочу сохранить свой dockerfile только для установки apache и php. Как я могу добиться этого с помощью docker-compose.yaml или любым другим способом.

Обновлено: Docker Container Logs

*** Running /etc/my_init.d/00_regen_ssh_host_keys.sh...
*** Running /etc/rc.local...
*** Booting runit daemon...
*** Runit started as PID 9
Jul 10 08:27:33 6d5c09e83a98 syslog-ng[15]: syslog-ng starting up; version='3.5.3'

Спасибо

3

Решение

Судя по выводу ваших логов, изображение, которое работает, когда вы делаете docker-compose up не использует CMD вы указали. Это, вероятно, потому что он был построен при первом запуске docker-compose up и не был впоследствии восстановлен. Чтобы обойти это, попробуйте запустить с docker-compose up --build,

Когда я построил & запустил ваш образ (с предоставленным вами docker-compose.yml) Я запустил Apache — мой вывод был похож на:

Successfully built d65dabcc2595
Creating apachenotrunningautomaticallyondockercomposeup38280007_frontend_1
Attaching to apachenotrunningautomaticallyondockercomposeup38280007_frontend_1
frontend_1  | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.25.0.2. Set the 'ServerName' directive globally to suppress this message

Я думаю, что запуск apache таким способом не является наилучшей практикой, учитывая изображение, которое вы используете, хотя — рекомендуемый способ будет с служебный файл как phusion/baseimage использует пользовательскую систему инициализации, чтобы обойти некоторые потенциальные проблемы с Docker.

Вы можете следовать их рекомендуемому пути, создав файл службы для Apache. Если вы создаете (в вашей папке веб-интерфейса) скрипт с именем apache.sh (убедитесь, что это chmod +x) с этим содержанием:

#! /bin/sh

exec /usr/sbin/apache2ctl -D FOREGROUND

И измените свой Dockerfile, чтобы он выглядел так:

FROM phusion/baseimage:0.9.16
MAINTAINER Raheel <raheelwp@gmail.com>

# Apache
RUN apt-get update
RUN apt-get -y install apache2

# PHP
RUN apt-get -y install python-software-properties
RUN add-apt-repository ppa:ondrej/php
RUN apt-get update
RUN apt-get -y --force-yes install php7.0
RUN apt-get -y --force-yes install libapache2-mod-php7.0 php7.0-curl php7.0-json

RUN mkdir /etc/service/apache
ADD apache.sh /etc/service/apache/run
RUN chmod +x /etc/service/apache/run

Затем он будет использовать предоставленную систему инициализации.

В ответ на ваш второй вопрос, я думаю, у вас есть 2 основных варианта:

  1. Если вы должны держать их в объеме & быть доступным для обоих ваших пользователей на хосте (который, вероятно, с UID & gid 1000), тогда вы можете убедиться, что пользователь, который apache запускает ваше приложение, имеет тот же uid & gid как ваш пользователь на хосте (создайте другого пользователя & скажите apache использовать этого пользователя в вашей конфигурации apache). Это будет работать, но будет гораздо менее переносимым для систем, где пользователь на хосте отличается.

  2. Добавьте это в ваш Dockerfile и удалите параметры тома из docker-compose.yml:

    RUN mkdir -p /var/www/html/frontend/
    COPY . /var/www/html/frontend/
    RUN chown -R www-data:www-data /var/www/html/frontend
    

Если бы это был я, я бы выбрал вариант 1 для среды разработки (поскольку переносимость, вероятно, менее важна), но вариант 2 для любого вида производственного развертывания (поскольку большое преимущество docker заключается в неизменности контейнеров).

1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector