与构建输出和无源
回答
最新版本的docker支持多级构建,可以将构建产品从容器复制到另一个构建产品。
https://docs.docker.com/engine/userguide/eng-image/multistage-build/
两个常见的选项:
如前所述,你可以建立外部和编译的结果复制到容器中。
将您的下载,构建和清理步骤合并为一个
RUN
命令。这是最小化每个图层大小的常见最佳做法。
第二种选择的例子Dockerfile会是什么样子:
FROM mybase:latest
RUN apt-get update && apt-get install tools \
&& git clone https://github.com/myproj \
&& cd myproj \
&& make \
&& make install
&& cd .. \
&& apt-get rm tools && apt-get clean \
&& rm -rf myproj
该线将是比这更复杂一点,但是这是要点。
创建搬运工文件运行构建过程,然后运行清理代码
实施例:
FROM node:latest
# Provides cached layer for node_modules
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /dist && cp -a /tmp/node_modules /dist/
RUN cp /tmp/package.json /dist
ADD . /tmp
RUN cd /tmp && npm run build
RUN mkdir -p /dist && cp -a /tmp/. /dist
#run some clean up code here
RUN npm run cleanup
# Define working directory
WORKDIR /dist
# Expose port
EXPOSE 4000
# Run app
CMD ["npm", "run", "start"]
在你搬运工撰写文件
web:
build: ../project_path
environment:
- NODE_ENV=production
restart: always
ports:
- "4000"
通过将其作为单独的RUN命令执行,可以创建包含所有构建包括工具,然后在下面的图层中删除它们。结果是,即使文件不再存在,图像也会更大并且需要更长时间才能通过网络发送。 – BMitch
- 创建具有搬运工图像所有需要的工具来构建您的代码,也可以克隆代码并构建它。构建完成后,必须将 复制到docker卷中,例如卷名为
/opt/webapp
。使用在步骤建立图像1docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name
,将使用其中您的构建代码驻留构建搬运工的共享卷启动
nginx
搬运工容器启动构建搬运工容器。
docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name
构建并将构建代码发送到Appserver之后。您可以删除
BuildContainer
,因为这不再是必需的。
的上述步骤优势:
- 你的构建代码将在主机,所以如果一个泊坞窗失败或停止然后你构建代码将在主机的安全,你可以启动新码头工使用该构建代码。
- 如果您为构建代码创建docker映像,那么每次启动docker时都不需要安装所需的工具。
- 你也可以在主机上建立你的代码,但是如果你想让你的代码每次都在新鲜的环境中构建,那么这将会很好。或者如果使用同一台主机建立/编译代码每次然后一些较旧的源代码可能会产生问题,或者混帐克隆错误等
编辑:
可以追加:ro
(只读)以一个容器不会影响另一个容器的容积。你可以阅读更多关于码头卷。感谢@BMitch提出建议。
有趣的设计。如果这样做,考虑安装卷只读(附加':ro'到卷装),以便一个正在运行的容器不会影响另一个容器。 – BMitch
你可以做一些非常相似的事情,而不用第二张图片的卷(本例中为“nginx”)。这样,编译后的工件就被包含在目标图像中,并可以随之分发。 https://github.com/dnephin/dobi/tree/master/examples/minimal-docker-image是如何使用'dobi'这个专门为这种事情创建的工具来做到这一点的一个例子。 – dnephin
@dnephin你可以添加一个关于这个单独的答案。我们希望构建包含在图像中的产品,使其更加独立。我一直不得不告诉人们“看这个答案中的第二个评论”,而不是“看这个答案”。 – rjmunro
- 1. 的Jython构建无输出
- 2. Gogs构建失败,出现“无法构建的Go源文件”
- 3. Eclipse自动构建输出与Maven命令行构建输出交互
- 4. 构建Java错误:无法写输出
- 5. 输出不与源correnspond
- 6. ubuntu linux上构建铬源代码后输出
- 7. COBOL表结构和输出
- 8. routerLink无法与AOT构建
- 9. CCNET构建出版商与多种来源迪尔
- 10. Python创建wordcloud无输出
- 11. python从源代码构建:无法构建可选模块sqlite3
- 12. 构建无源代码的DataGridView表?
- 13. TFS 2010构建成功,但无法输出文件夹
- 14. WIX和NAnt:无法构建WIX源代码
- 15. 无法构建NuGet包...包含源代码和符号文件
- 16. 源码匹配表1与表2 id列和输出数据
- 17. 构建降压输出文件夹
- 18. 对Log4Net输出结构的建议
- 19. 包含构建输出作为附件
- 20. 在构建时禁用详细输出
- 21. 使用jCanvas.js构建AI2Canvas输出
- 22. 构建输出过滤错误消息
- 23. 字符串构建器输出
- 24. 从源码Jruby和Buildr构建apache ODE
- 25. 从源代码构建Nginx和OpenSSL
- 26. 使用shelveset和changset构建源代码
- 27. 构建android源码
- 28. 源构建vs二进制构建?
- 29. 输出缓存和资源文件
- 30. 电源外壳输出和优化
使用'dobi'(免责声明,我是这个工具的作者)来自动完成这一过程的一个例子:https://github.com/dnephin/dobi/tree/master/examples/minimal-搬运工形象。 'dobi'就是为这些类型的任务而设计的。撰写不是专门为这类项目构建任务而设计的。 – dnephin