我已经创建了一个简单的Dockerfile来安装apache和PHP,然后从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相同
发布于 2021-07-10 16:41:02
您的两种方法并不完全相同。您正在docker编写中使用卷,而不是在docker调用中。你的问题就出在这里。
更具体地说,请注意,在docker compose中,您正在将主机的./src挂载到容器的./var/www中-这不会给您提供正确的结构,因为您“隐藏”了包含您的composer.json (在构建时复制到容器中)的容器文件夹。
为了避免这种混乱,我建议,如果您想使用compose挂载一个卷(这对于开发来说是一个好主意),那么您的docker-compose.yml文件应该挂载与Dockerfile中的COPY命令完全相同的卷。例如:
volumes:
- ./src/html:/var/www/html
- ./composer.json:/var/www/html/composer.json或者,从docker-compose.yml中删除volumes指令。
请注意,将文件(在本例中为composer.json)复制到容器中的文件夹中,同时将相同的文件夹原样复制到容器中,这可能会导致其他问题和混乱。最好让容器上的结构尽可能地模仿主机上的结构。
https://stackoverflow.com/questions/68325859
复制相似问题