Почему файл composer. json из каталога тома не отображается в команде composer install, запущенной в dockerfile? - PullRequest
2 голосов
/ 25 марта 2020

docker -compose.yml:

version: '3.3'
services:
    web:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - ./api:/var/www/html/api
            - ./site.conf:/etc/nginx/conf.d/default.conf
        links:
            - php
    php:
        build:
            context: ./docker
            dockerfile: php.Dockerfile
        volumes:
        - ./api:/var/www/html/api
        links:
            - db
    db:
       image: mysql:5.7 
       environment:
         MYSQL_ROOT_PASSWORD: password
         MYSQL_DATABASE: symfony
         MYSQL_USER: symfony
         MYSQL_PASSWORD: symfony
       ports:
         - "9906:3306"

php .Dockerfile:

FROM php:7-fpm
WORKDIR /var/www/html/api
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y git libzip-dev unzip \
    && docker-php-ext-install \
        pdo_mysql zip \
    && docker-php-ext-enable \
        pdo_mysql zip \
    && composer install \
    && bin/console make:migration

Ошибка с выхода команды: docker-compose build --no-cache:

Composer не удалось найти файл composer. json в / var / www/html/api

Однако, когда я нахожусь внутри контейнера PHP, используя docker exec -it sf4_php_1 bash

Я вижу, что файл composer.json находится в /var/www/html/api, и я могу правильно запустить composer install.

Что я делаю не так?

1 Ответ

3 голосов
/ 25 марта 2020

Том монтируется в время выполнения , а не в build время.

Когда вы создаете образ, там нет composer.json, потому что ваш Том еще не был подключен.

Перед запуском composer install вам необходимо скопировать всех необходимых файлов для процесса сборки.

Например, лучше Dockerfile было бы что-то вроде этого:

(в данном случае я привожу Symfony файлы, так как это скопировано с Symfony изображения)

COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y git libzip-dev unzip \
    && docker-php-ext-install \
        pdo_mysql zip \
    && docker-php-ext-enable \
        pdo_mysql zip

RUN mkdir -p /var/www/html/api
WORKDIR /var/www/html/api

COPY composer.json composer.lock symfony.lock .env.dist ./

RUN composer install \
    && bin/console make:migration

Это не только на самом деле будет работать, но генерировать разные уровни для построения вашего приложения и установки требований платформы. При этом изменения в composer.json не приведут к переустановке расширений PHP и обновлению apt.

...