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'
Спасибо
Судя по выводу ваших логов, изображение, которое работает, когда вы делаете 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 основных варианта:
Если вы должны держать их в объеме & быть доступным для обоих ваших пользователей на хосте (который, вероятно, с UID & gid 1000), тогда вы можете убедиться, что пользователь, который apache запускает ваше приложение, имеет тот же uid & gid как ваш пользователь на хосте (создайте другого пользователя & скажите apache использовать этого пользователя в вашей конфигурации apache). Это будет работать, но будет гораздо менее переносимым для систем, где пользователь на хосте отличается.
Добавьте это в ваш 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 заключается в неизменности контейнеров).
Других решений пока нет …