docker-compose build 和 docker build 给出不同的结果

docker-compose build and docker build giving different results

我创建了一个简单的 Dockerfile 来使用 PHP 安装 apache,然后从 composer.json.

安装软件包
FROM php:7-apache

WORKDIR /var/www/html

COPY ./src/html/ .
COPY composer.json .

RUN apt-get update
RUN apt-get install -y unzip

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN composer update

当我 运行 docker build -t my-web-server . 后跟 docker run -p 8080:80 my-web-server 时,一切正常,软件包安装。

但是当我使用 docker-compose 文件时:

version: "3.9"
services:
  ecp:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www

并执行 docker-compose build 然后 docker-compose up 软件包没有安装,我只是 index.php 被带到容器

我当前的文件结构:

src
 |-- html
     |-- index.php
composer.json
docker-compose.yaml
Dockerfile

docker-compose 正在构建映像时,所有控制台输出都与 docker build

的相同

你的两种方法并不相同。您在 docker 撰写中使用卷,而不是在 docker 调用中使用卷。你的问题就在那里。

更具体地说,请注意,在您的 docker compose 中,您正在将主机的 ./src 安装到容器的 ./var/www - 这不是为您提供正确的结构,因为您“ shadow" 包含您的 composer.json 的容器文件夹(在构建时复制到容器中)。

为了避免这种混淆,我建议如果你想用你的 compose 挂载一个卷(这对开发来说是个好主意),那么你的 docker-compose.yml 文件应该挂载与 COPY 命令在你的 Dockerfile 中。例如:

volumes:
  - ./src/html:/var/www/html
  - ./composer.json:/var/www/html/composer.json

或者,从 docker-compose.yml 中删除 volumes 指令。

请注意,将文件(在您的情况下 composer.json)复制到容器中的文件夹,同时将同一文件夹也复制到容器中可能会导致其他问题和混乱是。最好让容器上的结构尽可能地模仿主机上的结构。