【问题标题】:docker-compose build and docker build giving different resultsdocker-compose build 和 docker build 给出不同的结果
【发布时间】:2021-07-10 07:57:23
【问题描述】:

我创建了一个简单的 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 相同

【问题讨论】:

  • 首先运行apt,然后运行composer(您必须为此复制其文件),然后复制您的代码。关键是,对 HTML 的每一次更改都会让你在 Dockerfile 中重复执行之后的步骤,即使它们的结果没有改变。

标签: php docker docker-compose dockerfile composer-php


【解决方案1】:

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

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

为了避免这种混淆,我建议如果你想用你的 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)复制到容器中的文件夹,同时将相同的文件夹也按原样复制到容器中,可能会导致其他问题和混乱。最好让容器上的结构尽可能地模仿主机上的结构。

【讨论】:

  • 酷。请注意,这样一来,您最终会在主机的 src/html 文件夹中获得 composer.json 的副本 - 这可能需要也可能不需要。
  • 我还注意到,仍然存在一个问题,即在 /html 中创建供应商文件夹,然后一旦你执行 docker-compse up 卷将覆盖该文件夹并删除供应商文件夹,如果它不存在于外部机器上,所以我定义了一个名为 vendor 的卷并将其指向 /var/www/html/vendor,这样它就不会在构建/构建中被覆盖。但仍然不影响便携性。如果这是有道理的。并且 ./composer 卷不是必需的,因为供应商是在 dockerbuild 中创建的,它也停止了该重复问题。但它需要在每次 dep 更改时重新构建。
  • 是的。在我的 PHP 网站中,我的根目录包含 Dockerfilecomposer.json 和所有 PHP 文件(以 index.php 开头)所以我的 Dockerfile 只是在做 COPY . . 然后很容易挂载并与之合作。
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多