如何构建nginx docker容器以及它所服务的资产的构建

Nic*_*rum 0 nginx docker webpack

我在docker容器中运行nginx服务,它提供一些静态文件和1个编译文件(由webpack构建的js包.)

我不希望我的源文件在nginx容器中 - 而是我只想要允许nginx在那里提供的文件.

因此,我目前有2个docker容器 - 1个生成.js包,它必须在构建第二个docker镜像之前运行 - 然后从主机中获取捆绑文件(由第一个容器的运行生成). )

这似乎是错的,因为我的nginx图像构建应该可以立即从源代码中运行.

但是,如果我将webpack构建添加到nginx图像dockerfile中,那么我将不得不将整个源复制到容器中,这也感觉不对.

我错过了什么?

(注意:我考虑过复制那里的文件,然后进行构建然后只是rm我不想要的文件,但它看起来很蹩脚,并且会不必要地增加容器的大小.如果这是正确的方法,我愿意接受! )

Rob*_*ake 7

您可以使用Docker 17.05中引入的Dockerfile 的多阶段构建功能获得所需的功能.

多阶段允许您做的是通过在一个容器中构建工件然后立即将该工件复制到另一个容器中来生成单个Docker镜像,所有这些都来自一个Dockerfile.因此,在您的情况下,它将允许您构建您的webpack包,然后将该包复制到nginx容器中,而不包括任何源JS文件.这将删除所有黑客,例如必须删除内容或拥有一个过度配置软件的容器,例如你的nginx Docker镜像不需要安装webpack.

所以你会通过写一个Dockerfile看起来像这样的东西来处理它(命令只是一个例子,但我确信你可以用正确的替换它们):

FROM node:8.5.0 as webpack
COPY /src/js /src/js
RUN webpack /src/js/app.js /app.bundle.js

FROM nginx:1.13.5
COPY --from=webpack /app.bundle.js /usr/share/nginx/html
Run Code Online (Sandbox Code Playgroud)

上面的输出应该是一个轻量级的nginx Docker容器映像,其中包含你的webpack包而不是其他内容.