#laravel #docker #docker-compose #composer-php #dockerfile
#laravel #docker #docker-compose #composer-php #dockerfile
Вопрос:
У меня проблема с установкой laravel через dockerfile. Я использую docker-compose, который извлекает dockerfile, где у меня в основном есть это:
FROM php:7.3-apache-stretch
*some apt-get and install composer*
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel app
CMD apachectl -D FOREGROUND
но когда я получаю доступ к контейнеру и вижу файлы, которые должны были быть созданы с помощью composer, я вижу, что он пуст, хотя я видел команду, выполняемую при сборке контейнера.
Контейнер работает отлично, и даже я могу получить к нему доступ… только файлы, которые даже не отображаются.
Если я запускаю команду composer вручную после создания контейнера, появляются файлы.
Комментарии:
1. Можете ли вы поделиться точной командой, которую вы запускаете, и фактическим скриптом dockerfile и, возможно, тем, что показывает терминал при запуске вашей команды composer
2. вывод терминала гигантский… Я опустил предыдущий вывод для установки composer, потому что он не выдал ошибку … gist.github.com/miguelsmuller/c4d5af821683547f77618274b0473352
Ответ №1:
В вашем Dockerfile вы использовали WORKDIR /var/www
а затем RUN composer create-project ...
, что заставляет composer создавать файлы под /var/www
в контейнерной файловой системе.
В вашем файле docker-compose.yml, который вы использовали для запуска вашего контейнера:
version: '3.7' services: app: container_name: "app" build: context: ./docker dockerfile: Dockerfile-app ports: - "80" - "443" restart: always depends_on: - db volumes: - ".:/var/www"
Вы объявляете том, который будет смонтирован в том же месте /var/www
в вашем контейнере.
Что произойдет, так это то, что содержимое тома займет место того, что у вас было на /var/www
в файловой системе контейнера.
Я предлагаю вам внимательно прочитать документацию, касающуюся томов docker, и, более конкретно, часть, озаглавленную Заполнить том с помощью контейнера.
Теперь, чтобы двигаться дальше, спросите себя, зачем вам вообще понадобился этот том. Необходимо ли изменять файлы во время выполнения?
Если нет, просто добавьте свои файлы во время сборки:
FROM php:7.3-apache-stretch
*some apt-get and install composer*
WORKDIR /var/www
RUN composer create-project --prefer-dist laravel/laravel app
COPY . /var/www
CMD apachectl -D FOREGROUND
и удалите том для /var/www
.
Редактировать
Разработка с помощью контейнера Docker
Во время разработки вы изменяете php-файлы на своем хосте docker (предполагается, что это ваш компьютер для разработки), и вам необходимо часто проверять результат, тестируя ваше приложение, обслуживаемое веб-сервером из контейнера docker.
Было бы обременительно перестраивать образ Docker каждый раз, когда вам нужно протестировать свое приложение. Решение состоит в том, чтобы смонтировать том, чтобы контейнер мог обслуживать файлы с вашего компьютера разработки:
FROM php:7.3-apache-stretch
*some apt-get and install composer*
WORKDIR /var/www
CMD apachectl -D FOREGROUND
и запустите его с:
version: '3.7'
services:
app:
container_name: "app"
build:
context: ./docker
dockerfile: Dockerfile-app
ports:
- "80"
- "443"
restart: always
depends_on:
- db
volumes:
- ".:/var/www"
...
Когда вам нужно выполнить некоторые команды в этом контейнере, просто используйте docker exec:
docker-compose exec app composer create-project --prefer-dist laravel/laravel app
Создание артефактов проекта
Поскольку вы будете развертывать не zip / tar-архив, содержащий ваш исходный код и конфигурации, а образ docker, вам необходимо создать образ docker, который вы будете использовать во время развертывания.
Dockerfile для рабочей среды
Для производственного использования вам нужен образ Docker, который содержит все необходимые файлы и не требует никакого тома docker, за исключением хранения данных, созданных пользователями (загруженные файлы, файлы базы данных и т.д.).
FROM php:7.3-apache-stretch
*some apt-get and install composer*
WORKDIR /var/www
COPY . /var/www
CMD apachectl -D FOREGROUND
Обратите внимание, что в этом Dockerfile нет RUN composer create-project --prefer-dist laravel/laravel app
. Это связано с тем, что эта команда предназначена для инициализации вашего проекта, и это задача времени разработки, а не времени развертывания.
Вам также понадобится место для размещения ваших образов docker (реестр Docker). Вы можете развернуть свой собственный реестр в качестве контейнера Docker, используя официальный образ реестра или тот, который предоставлен компаниями:
- Gitlab.com — Реестр Gitlab (бесплатно)
- Docker.com — hub.docker.com (1 частное изображение свободно)
- Google.com — Реестр контейнеров Google
- …
Итак, вам нужно создать образ docker, а затем поместить этот образ в свой реестр. Рекомендуется автоматизировать эти задачи с помощью инструментов непрерывной интеграции, таких как Jenkins, Gitlab CI, Travis CI, Circle CI, Google Cloud Build…
Ваше задание CI будет выполнять следующие команды:
git clone <url of you git repo> my_app
cd my_app
git checkout <some git tag>
docker build -t <registry>/<my_app>:<version>
docker login <registry> --user=<registry user> --password=<registry password>
docker push <registry>/<my_app>:<version>
Развертывание вашего образа Docker
Запустите контейнер с:
version: '3.7'
services:
app:
container_name: "app"
image: <registry>/<my_app>:<version>
ports:
- "80"
- "443"
restart: always
depends_on:
- db
...
Обратите внимание, что файл docker-compose не создает никакого изображения. Для работы лучше обращаться к уже созданному образу docker (который был развернут ранее в промежуточной среде для проверки).
Комментарии:
1. ОК… Я понял … Тогда я увижу лучшее решение… что касается объема, то оправданием является то, что редакция, которую я создаю для своих файлов, выполняется через хост. есть предложения?
2. вы используете этот образ docker для разработки или для запуска вашего приложения в рабочей среде?
3. разработка… но идея в том, чтобы играть в production без проблем…
4. В этом случае я бы использовал том на
/var/www
, удалилRUN composer create-project --prefer-dist laravel/laravel app
иCOPY . /var/www
из файла Dockerfile. Запустите контейнер, затем запуститеdocker exec <container_name> composer create-project --prefer-dist laravel/laravel app
5. Я отредактировал свой ответ с рекомендациями по переходу к работе с docker