为什么在 dockerfile 中运行的 composer install 命令中看不到卷目录中的 composer.json 文件?

Cod*_*ium 3 php composer-php docker

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"
Run Code Online (Sandbox Code Playgroud)

php.Docker 文件:

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
Run Code Online (Sandbox Code Playgroud)

命令输出错误docker-compose build --no-cache::

Composer 在 /var/www/html/api 中找不到 composer.json 文件

但是,当我在 PHP 容器中使用时 docker exec -it sf4_php_1 bash

我看到那个composer.json文件在里面/var/www/html/api,我可以composer install正常运行。

我做错了什么?

yiv*_*ivi 7

卷是在运行时安装的,而不是在构建时。

当您构建映像时,那里没有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
Run Code Online (Sandbox Code Playgroud)

这不仅会实际工作,还会为构建应用程序和安装平台要求生成不同的层。这样,更改composer.json不会触发重新安装 PHP 扩展和更新 apt。