Docker撰写合并子Docker模块的输出

约翰·P

我正在构建一个基于Web的应用程序,每个角色都有单独的reactjs项目。(请考虑一个公共响应站点和一个管理站点)。每个Web模块都位于单独的目录中,但是我想将结果组合到单个nginx部署中。我目前在每个目录下都有一个Dockerfile可以为该目录构建映像,但是我不想以2个映像结束,因为这浪费了空间和资源。

目录结构

root
   admin-ui
   public-ui
   api

我希望将两个UI项目的输出创建在如下所示的单个文件结构中,因此我不需要在子域下运行它,也不需要让额外的Docker容器运行管理部分。

root
    index.html \\public-ui
    admin
        index.html \\admin-ui

我想这可以通过在根级别使用Dockerfile来完成,该Dockerfile在上下文中复制两个ui目录并在那里进行所有构建,但是我希望有一个更优雅的解决方案-也许使用一个Docker构建的输出作为输入到另一个目录,这样我就可以独立构建目录,然后创建具有合并结果的映像。

大卫·迷兹

有两种方法可以解决此问题。最大的不同是您需要运行多少个命令,独立运行项目有多容易,以及运行构建过程需要多少Docker。

在主机上运行大多数构建过程。在注释中,您写出了一系列命令来构建没有Docker的两个项目。您可以完全按原样运行,并仅使用Docker构建最终映像。

# combined/Dockerfile
FROM nginx
COPY . /usr/share/nginx/html
(cd public-ui && yarn build)
(cd admin-ui && yarn build)
cp -a public-ui/build/* combined
cp -a admin-ui/build combined/admin
docker build ./combined

从根目录中的Dockerfile运行整个构建过程。您可以通过多阶段构建来实现;从技术上讲,这确实会创建多个图像,但是您可以轻松清理它们。

# Dockerfile
FROM node AS public
WORKDIR /app
COPY public-ui/package.json public-ui/yarn.lock .
RUN yarn install
COPY public-ui .
RUN yarn
CMD ["node", "build/main.js"]

FROM node AS admin
# similarly

FROM nginx
COPY --from=public /app/build /usr/share/nginx/html
COPY --from=admin /app/build /usr/share/nginx/html/admin

继续构建三个单独的图像。这样一来,您就可以在开发设置中独立运行子项目映像。但是您可以COPY --from=...将这些图像中的静态文件转换为最终图像以供生产使用。不过,Docker工具并不直接支持此设置。您需要手动运行单独的docker build命令来构建整体。

# combined/Dockerfile
FROM nginx
ARG tag=latest
COPY --from=me/public:${tag} /app/build /usr/share/nginx/html
COPY --from=me/admin:${tag} /app/build /usr/share/nginx/html/admin
tag=20210213
docker build -t me/public:$tag ./public
docker build -t me/admin:$tag ./admin
docker build -t me/app:$tag --build-arg tag=$tag ./combined
# docker rmi me/public:$tag me/admin:$tag

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章