假设你有你的 Web 应用程序和一些工作流执行程序:
- HTTP 服务器(提供预构建资产文件) - 生产
- 构建器(从源代码编译/捆绑 JS/CSS/HTML) - 部署/开发
- 调试器/生成器(动态从源代码构建,添加 JS 源代码映射)- 开发
- 硒(运行测试)-集成测试
我们如何构建分层图像以使这些工作流执行程序最有效地工作?实际上,我的意思是"运行最快,写作最少"。
答案可能很简单:只需创建一个 4 个Dockerfile
一个取决于另一个。
您可以添加卷以从源部分共享构建。问题是您希望将结果资产包含在映像中还是每次都从源构建它。
创建 4 个文件夹,每个文件夹都有Dockerfile
。
生产
production/Dockefile
:
FROM # put server here
COPY # put config here
# some other option
# volume sharing?
建
build/Dockerfile
:
# install dependencies
ADD # add sources here
RUN # some building script
调试
debug/Dockefile
:
# ideally, configure production or build image
测试
test/Dockefile
:
FROM # import production
# install test dependencies
RUN # test runner
还有几种选择。1. 使用带有否定模式的 .gitignore (或 ADD?
*
!directory-i-want-to-add
!another-directory-i-want-to-add
另外,使用 docker 命令指定 docker文件和上下文:
docker build -t my/debug-image -f docker-debug .
docker build -t my/serve-image -f docker-serve .
docker build -t my/build-image -f docker-build .
docker build -t my/test-image -f docker-test .
你也可以使用不同的gitignore 文件。
- 装载卷完全跳过发送上下文,只需在运行时使用挂载卷(使用
-v host-dir:/docker-dir
)。
因此,您必须:
docker build -t my/build-image -f docker-build . # build `build` image (devtools like gulp, grunt, bundle, npm, etc)
docker run -v output:/output my/build-image build-command # copies files to output dir
docker build -t my/serve-image -f docker-serve . # build production from output dir
docker run my/serve-image # production-like serving from included or mounted dir
docker build -t my/serve-image -f docker-debug . # build debug from output dir
docker run my/serve-image # debug-like serving (uses build-image with some watch magic)