【发布时间】:2020-04-16 22:45:51
【问题描述】:
我想将安装过程中的所有文件复制到docker-compose.yml文件中。
如果我跑步:
$ git clone https://github.com/laravel/laravel.git laravel-app
$ cd laravel-app
$ docker run --rm -v $(pwd):/app composer install
它会在 docker 容器中的安装过程中将所有新文件从容器复制到主机。
所以我会在安装后在我的laravel-app 目录中看到新的vendor 文件夹和composer.lock 文件。
但如果我在docker-compose.yml 中设置音量:
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
然后在Dockerfile设置安装过程:
FROM php:7.4.4-fpm
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Copy existing application directory contents
COPY . /var/www
# Install composer.json dependencies
RUN composer install # <<-- !this one!
它不会将vendor 文件夹和composer.lock 文件复制回我的主机。
实现它很热门?
【问题讨论】:
-
你试过在复制之前运行 composer install 吗?只是一个想法。让我回答是否正确
-
您的问题源于对卷在 构建时 与 运行时 期间如何工作的误解。不久前我遇到了同样的问题,我花了一段时间才弄清楚。问题是,volumes don't take effect during the build phase。在您通过
docker run或docker-compose run重新运行命令之前,您在构建期间创建的任何内容几乎看起来都“消失”了。有几种方法可以解决这个问题,但根据你想要做什么,它可能会变得很棘手。 -
如果您想在运行容器时自动将文件安装到主机上,您需要创建一个自定义入口点脚本。这在运行时执行,您可以设置自己的自定义 Bash / Shell 脚本来执行您需要的任何命令,然后再运行用户指定的命令。在这种情况下,您可以检查必要的文件结构是否存在,如果不存在,则会在工作目录中创建文件并自动保存到卷挂载。
-
@Jonathan 是的,但它失败了,因为
composer install进程需要之前克隆的所有 git repo 文件(应用程序目录内容),而不仅仅是composer.json文件。 -
@maiorano84 谢谢你的解释。几个小时后我得到了它:) 那么,在
docker-compose构建过程中是否有可能强制将文件复制回主机?这将非常方便。也许我应该只指定一些标志?或者我可以在RUN composer install步骤之后再添加一个命令,就像COPY app:/var/www/. ./一样?
标签: php laravel docker docker-compose dockerfile