【问题标题】:Docker: docker-compose copy files from container to hostDocker:docker-compose 将文件从容器复制到主机
【发布时间】: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


【解决方案1】:

如何将 composer docker 镜像添加到您的 docker compose 中,然后运行命令安装

version: '3'
services:
    #PHP Service
    #your php image

    # composer
    composer:
      image: composer/composer
      volumes:
        - ./:/var/www
      command: install

【讨论】:

  • 感谢您的想法,将作曲家包含到项目中更加清晰。但我认为这并不能解决主要问题,因为docker-compose 在构建映像期间仍然不会像之前提到的@maiorano84 那样将文件复制到主机。
【解决方案2】:
  • 您将所有构建上下文复制到您的映像中/var/www

  • 你从镜像中运行composer install,所以vendor和composer.lock只存在于镜像中,不在你的主机上

  • 你绑定挂载你的当前目录(有composer.json但没有vendor和composer.lock)到/var/www,所以它替换了图像/var/www

你知道你的问题,修复取决于你想做什么,在评论中告诉我。

提示:您应该使用 Docker 多阶段构建将 Composer 安装到您的映像中。比curl干净多了

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

COPY . /var/www/

RUN composer install --no-scripts --no-suggest --optimize-autoloader

【讨论】:

  • 感谢多阶段构建提示。我想在步骤RUN composer install 的docker-compose 构建期间自动将文件从容器复制到主机。可能是COPY app:/var/www/. ./ 之类的东西。
猜你喜欢
  • 2015-07-08
  • 2020-11-10
  • 2021-08-31
  • 2014-03-29
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多