Docker:docker-compose 将文件从容器复制到主机

mr.*_*ris 6 php laravel docker dockerfile docker-compose

我想在安装过程中将所有文件复制到docker-compose.yml文件中。

如果我运行:

$ git clone https://github.com/laravel/laravel.git laravel-app
$ cd laravel-app
$ docker run --rm -v $(pwd):/app composer install
Run Code Online (Sandbox Code Playgroud)

它将在 docker 容器中的安装过程中将所有新文件从容器复制到主机。

所以我会在安装后在我的目录中看到新的vendor文件夹和composer.lock文件laravel-app


但是,如果我将音量设置为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
Run Code Online (Sandbox Code Playgroud)

然后在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!
Run Code Online (Sandbox Code Playgroud)

它不会将vendor文件夹和composer.lock文件复制回我的主机。

热到让它发生?

Shi*_*n83 3

  • 您将所有构建上下文复制到图像中/var/www

  • composer install您从映像运行,因此vendor仅存composer.lock在于映像中,而不存在于您的主机上

  • 您将当前目录(有composer.json但没有vendorcomposer.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 Code Online (Sandbox Code Playgroud)