Установка Composer с помощью dockerfile

Я новичок в докере, я пытаюсь автоматически выполнить установку композитора в моем файле Docker, но мне кажется, что я не могу войти в свое приложение во время установки, что не так? Или, может быть, есть другой способ лучше?

мой docker-compose.yml

version: "3.1"
services:

    app:
      image: nginx:alpine
      container_name: app
      working_dir: /application
      volumes:
          - ./Projects/app:/application/app
          - ./Docker/nginx/app.conf:/etc/nginx/conf.d/app.conf
      ports:
          - "8080:8080"

    php-fpm-app:
      build: Docker/php-fpm-app
      container_name: php-fpm-app
      working_dir: /application
      volumes:
          - ./Projects:/application
          - ./Docker/php-fpm-app/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini

мой Dockerfile

FROM phpdockerio/php72-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

RUN mkdir -p /var/www/.composer \
    && chown -R www-data:www-data /var/www/.composer

USER www-data

RUN cd /application/app; composer install

Результат после запуска этой команды:

docker-compose up -d

Step 6/6 : RUN cd /application/app; composer install
 ---> Running in ac53e653af46
/bin/sh: 1: cd: can't cd to /application/app
Composer could not find a composer.json file in /application
To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section
ERROR: Service 'php-fpm-app' failed to build: The command '/bin/sh -c cd /application/app; composer install' returned a non-zero code: 1

Если я попытаюсь удалить последнюю строку из моего Dockerfile, как только он будет запущен, если я выполню эту команду:

docker-compose exec --user www-data php-fpm-app bash -c 'cd /application/app && composer install'

Это работает, я не понимаю, почему я не могу этого сделать с моим Dockerfile.

=========================== Наконец Я нахожу способ выполнить сценарий, но не вижу вывода, поэтому, если сценарий длится много секунд / минут, я не буду знать, когда он будет выполнен.

ADD ./setup.sh /setup.sh
RUN chmod +x /setup.sh
CMD ["sh", "/setup.sh"]

Я решил запустить этот скрипт вручную, когда все будет готово.

sh ./setup.sh

на этот раз опустите часть «установка композитора» и войдите в контейнер (после того, как он будет запущен и запустится), и попытайтесь вручную выполнить установку композитора внутри контейнера.

Cooshal 05.09.2018 15:35

Да, это работает, если я сделаю это, когда он будет запущен

RaKoDev 05.09.2018 15:40

вопрос не в существовании composer.json. это там. но ваша ошибка заключается в том, что он не может cd в / application / app, и поскольку ваш WORKDIR - / application, он возвращается в этот каталог, и поэтому, если вы посмотрите на свою ошибку, он говорит, что не может найти composer.json в / application /bin/sh: 1: cd: can't cd to /application/app Composer could not find a composer.json file in /application

Cooshal 05.09.2018 15:48

и вместо WORKDIR / application можно попробовать установить его в / application / app, удалить RUN cd /application/app и просто сделать RUN composer install

Cooshal 05.09.2018 15:51

Я уже пробовал это решение, но кажется, что файлы не были найдены до его запуска.

RaKoDev 05.09.2018 16:04

Директивы «volume» в файле docker-compose.yml не влияют на сборку образа; вам необходимо скопировать код вашего приложения. (В этот момент установка тома поверх него является излишней, если вы не возражаете против рабочего процесса, когда вам нужно тестировать-сборку-запускать после внесения изменений.)

David Maze 05.09.2018 16:10

Может быть, есть способ запустить какую-нибудь команду или скрипт, когда он будет запущен?

RaKoDev 05.09.2018 16:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
8
5 812
3

Ответы 3

Ссылаясь на Документация для Dockerfiles, вам нужно отредактировать свой Dockerfile.

должен быть:

WORKDIR /application/app
RUN composer install

Решает ли это вашу проблему?

Шаг 6/6: RUN composer install ---> Запуск в 9821f69e3ce0 Composer не может найти файл composer.json в / application / app Но есть файл composer.json

RaKoDev 05.09.2018 15:15

Вы не должны запускать установку композитора в Dockerfile. Это не удастся, потому что вы еще не создали / синхронизировали том из локального в контейнер. Таким образом, все файлы, включая composer.json, не помещаются в / var / www / html.

Что вы можете сделать, так это добавить 1 строку (команду) в файл docker-compose.yaml внутри службы, например.

services:
  api-php-fpm:
    build: ./docker/php-fpm
    command: sh -c "composer install"

Это связано с тем, что тома не монтируются до завершения сборки. Просто используйте COPY, чтобы скопировать Только composer.json в папку и запустить установку композитора как обычно.

Другие вопросы по теме