Как запустить команду `composer install` в контейнере PHP так, чтобы контейнер оставался в режиме работы (Up)?

Как настроить Dockerfile так, чтобы при старте контейнера происходила загрузка всех зависимостей, перечисленных в файле composer.json, без того чтобы PHP контейнер завершался с кодом Exited (0)?
  • 29 июля 2024 г. 22:13
Ответы на вопрос 2
Для того чтобы запустить команду `composer install` в контейнере PHP и оставить его работающим в режиме `Up`, можно воспользоваться командой `docker exec`. 

1. Необходимо сначала запустить контейнер PHP с помощью команды `docker run`, указав необходимые параметры (пример: `docker run -d --name=my-php-container my-php-image`).

2. Затем, для выполнения команды `composer install`, можно воспользоваться командой `docker exec`, указав имя контейнера и саму команду. Например: `docker exec my-php-container composer install`.

Чтобы настроить Dockerfile для загрузки всех зависимостей при старте контейнера, необходимо добавить команду `composer install` в Dockerfile перед запуском сервера (например, Apache или Nginx). Примерно так:

```Dockerfile
FROM php:7.4-apache

WORKDIR /var/www/html

COPY . .

RUN apt-get update && apt-get install -y \
    unzip \
    && rm -rf /var/lib/apt/lists/* && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY composer.json .
COPY composer.lock .

RUN composer install

CMD ["apache2-foreground"]
```

Таким образом, при запуске контейнера стартовая команда будет `composer install`, которая установит все зависимости, перечисленные в файле composer.json. После этого будет запущен веб-сервер Apache. Контейнер не завершится с кодом `Exited (0)`, так как веб-сервер будет работать и ожидать входящих запросов.
Ну потому, что ты запускаешь композер... И все, это весь твой ENTRYPOINT, который отработав отдает код 1. Ты же не запускаешь свой условный php-fpm и правда этому удивляешься? 

> что бы при старте контейнера в нем сразу загружались все перечисленные зависимости из файла composer.json

В этом не то, чтобы много смысла, Dockerfile это не про старт контейнера, а его сборку. Если тебе нужно будет обновить зависимости - ты будешь пересобирать весь образ? Это не очень логично.

Можно запустить любой готовый образ композера с командой install, чтобы у тебя приехали все зависимости.
Можно зайти в шелл запущенного контейнера php и сделать composer i.
Можно конечно написать рабочий Dockerfile, который делает RUN composer i , а в ENTRYPOINT'е имеет запуск демона php-fpm...
Похожие вопросы