docker - 如何使用 docker compose 在容器之间共享构建阶段准备好的文件
问题描述
我有 2 项服务:nginx
和web
当我构建web
图像时,我通过命令构建前端npm install && npm run build
但我需要在两个容器中准备好文件:web
在nginx
.
如何在容器(图像)之间共享文件?我不能简单地使用卷,因为它们只会在运行时挂载。
解决方案
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 build
docker-compose push
推荐阅读
- java - 从 Quartz 作业调用 EJB
- django - django:断言错误`create()`没有返回对象实例
- javascript - 在 NodeJS 中使用 Request 或 Needle 的套接字挂断错误
- reactjs - StackNavigator中的React-native TabNavigator,不能在屏幕之间移动
- html - Hostgator 显示我所有的 html 文件而不是索引
- excel - 如何从 Web VBA 导入过时的 xls 文件
- java - java.io.IOException:方案没有文件系统:maprfs。将 maprfs jar 添加到 bash_profile 不起作用
- string - 我将如何撤消 string.gmatch 对 lua 中某个字符串部分的操作
- expo - 升级 Expo react-native-svg 依赖版本
- java - JButton 图标的响应大小