Ошибка установки laravel через composer в docker

#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, используя официальный образ реестра или тот, который предоставлен компаниями:

Итак, вам нужно создать образ 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