首页 > 解决方案 > 如何使用 docker compose 在容器之间共享构建阶段准备好的文件

问题描述

我有 2 项服务:nginxweb

当我构建web图像时,我通过命令构建前端npm install && npm run build

但我需要在两个容器中准备好文件:webnginx.

如何在容器(图像)之间共享文件?我不能简单地使用卷,因为它们只会在运行时挂载。

标签: dockerdocker-compose

解决方案


Dockerfile指令可以COPY任意图像复制文件。虽然它最常用于多阶段构建,但您可以将它用于任何图像,甚至是您自己构建的图像。

假设您的docker-compose.yml文件如下所示:

version: '3.8'
services:
  web:
    build: .
    image: my/web
  nginx:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    ports: [8000:80]

请注意,我们已明确为web图像命名;另请注意,volumes:此设置中没有。

在代理图像中,我们可以从该图像中复制文件:

# Dockerfile.nginx
FROM nginx
COPY --from=my/web /app/static /usr/share/nginx/html

这里唯一的复杂之处是 Compose 不知道一个图像是由另一个图像构建的。您可能必须手动告诉它重建应用程序映像,以便在代理映像之前构建它。

docker-compose build web
docker-compose build
docker-compose up -d

您可以在更面向生产的设置中使用它来部署此应用程序,而无需直接提供代码。您可以创建一个为这两个容器docker-compose.yml命名的基础,image:然后添加一个包含这些块的单独docker-compose.override.yml文件。如上所述build:运行两次后,您可以构建镜像,然后在您的生产系统上运行此容器堆栈,从注册表中获取镜像;没有源树的本地副本,也没有卷。docker-compose builddocker-compose push


推荐阅读