Ошибка установки laravel через composer в докере - PullRequest
0 голосов
/ 28 марта 2019

У меня проблема с установкой 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, появляются файлы.

1 Ответ

0 голосов
/ 30 марта 2019

В вашем Dockerfile вы использовали WORKDIR /var/www, а затем RUN composer create-project ..., что заставляет композитора создавать файлы в /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 в файловой системе контейнера.

Предлагаю вам внимательно прочитать документацию относительно томов докера и многое другое.в частности, часть под названием Заполните том с помощью контейнера .


Теперь, чтобы продолжить, спросите себя, зачем вам этот объем вообще нужен.Нужно ли менять файлы во время выполнения?

Если нет, просто добавьте файлы во время сборки:

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 каждый раз, когда вам нужно протестировать ваше приложение.Решение состоит в том, чтобы смонтировать том, чтобы контейнер мог обслуживать файлы с вашего компьютера разработки:

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

Dockerfile для производства

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

Итак, вам нужно создать образ докера, а затем вставить этот образ в свой реестр.Рекомендуется автоматизировать эти задачи с помощью инструментов непрерывной интеграции, таких как 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

Запуск контейнераwith:

version: '3.7'

services:
  app:
    container_name: "app"
    image: <registry>/<my_app>:<version>
    ports:
      - "80"
      - "443"
    restart: always
    depends_on:
      - db
...

Обратите внимание, что файл docker-compose не создает никакого образа.Для производства лучше обратиться к уже созданному образу докера (который был развернут ранее в промежуточной среде для проверки).

...