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
)复制到容器中的文件夹,同时将同一文件夹也复制到容器中可能会导致其他问题和混乱是。最好让容器上的结构尽可能地模仿主机上的结构。
我创建了一个简单的 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
)复制到容器中的文件夹,同时将同一文件夹也复制到容器中可能会导致其他问题和混乱是。最好让容器上的结构尽可能地模仿主机上的结构。