使用容器进行多阶段构建
当您完成交付时,系统很快就会变得非常大。这包括构建,通常是构建和测试环境。即使提取要发送的文件没有问题,但也很耗时。
容器提供了自动执行此操作的可能性。
在这里,您可以选择在一个文件中定义多个容器。使用 JavaScript 创建并使用 Node.js 构建的网站就是一个很好的例子。
示例:
Node.js:~ 400 MB – 600 MB
网络服务器 nginx:~ 20 MB
网站:~ 2 MB
整个系统作为一个容器导致总共超过 600 MB,尽管只需要 22 MB(网络服务器 + 网站)。此外,系统存在安全风险,因为存在软件,而生产操作不需要该软件。这里的解决方案是多阶段构建。
在多阶段构建中,在一个文件中定义了多个容器,然后只将必要的数据从一个容器传输到另一个容器。
多阶段 dockerfile 示例
为了继续使用 Node.js,这里有一个多阶段构建示例。第一个容器包含 Node.js 作为构建系统,在其中创建了网站。第二个容器包含 Web 服务器,它会在构建后从第一个容器中复制必要的数据。
## Base System Stage 1
## Use community Node.js container
FROM node:8.11.3 as buildsystem
## Add source from our Git project
COPY ./source /root/frontend
## Build frontend with Nodejs
WORKDIR /root/frontend/
RUN npm install \
&& npm run build
#####################################################################
#####################################################################
## Base System Stage 2
## Use community nginx container
FROM nginx:alpine
## Copy build from stage 1
RUN mkdir -p /var/www/html/<MyApp>
COPY --from=buildsystem /root/frontend/dist/ /var/www/html/<MyApp>/
## Add default config for nginx
ADD default.conf /etc/nginx/conf.d/
## Publish Port
EXPOSE 80
## Start nginx
CMD ["nginx", "-g", "daemon off;"]
结果是一个只包含最必要的小容器。我们为 alpine 的 nginx 使用了一个非常小的 Linux 发行版。
另一个优点是您可以访问两个现成的社区容器,因此无需创建和维护它们。对于系统更新,只需定期更换社区容器。使用 GitLab(或其他工具)可以在管道中完美地自动化整个事情。
工业技术