具有构build输出且无源的Docker容器
我有一个构build过程,将打字稿转换为JavaScript,缩小和连接CSS文件等
我想把这些文件放到一个nginx的docker容器中,但是我不想把原始的javascript / css源文件包含进来,也不需要我用来构build它们的工具。 有没有一个很好的方法来做到这一点,或者我必须运行docker(或在一个单独定义的容器)之外的构build,然后复制相关的文件?
这个页面以手动的方式谈论了类似的事情,但是并没有解释如何使用docker-compose或者其他东西来自动化这个过程。
- 使用所有必需的工具创build一个Docker镜像,以构build代码,以克隆代码并构build它。 在构build之后,它必须复制到docker卷中,例如卷名是
/opt/webapp
。 -
在步骤1中使用构build映像启动构build泊坞窗容器
docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name
-
启动将使用构build代码所在的构builddocker的共享卷的
nginx
docker容器。docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name
-
在构build并将构build代码发送到Appserver之后。 你可以删除
BuildContainer
因为这是不需要的。
以上步骤的优点:
- 您的构build代码将在主机中,所以如果一个
Appserver
停靠器失败或停止,那么您的构build代码在主机中将是安全的,您可以使用该构build代码启动新的Docker。 - 如果您为构build代码创buildDocker镜像,则每次启动Docker时都不需要安装所需的工具。
- 你也可以在主机上build立你的代码,但是如果你希望你的代码每次都能在新鲜的环境中build立起来,那么这样做会很好。 或者如果你每次使用同一台主机build立/编译代码,那么一些较旧的源代码可能会产生问题或git克隆错误等。
编辑:
你可以追加:ro
(只读)到一个容器不会影响另一个的容量。 你可以阅读更多关于docker容积在这里 。 感谢@BMitch的build议。
两个常用选项:
-
如前所述,您可以在外部构build并将编译结果复制到容器中。
-
您将下载,构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
线条会比这更复杂一些,但这是要点。
正如@dnephin在他对这个问题的评论以及@ pl_rock的回答中所build议的那样,标准的docker工具并不是用来做这件事的,但是你可以使用像下面这样的第三方工具:
- dobi (48个GitHub星)
- 打包机 (6210 GitHub星星)
- 摇杆 (759 GitHub星星)
- 输送机 (152 GitHub星)
(当我写答案时,GitHub星星正确)
我们和dobi一起去了,因为这是我们听到的第一个(因为这个问题),但是看起来packer是最受欢迎的。
最新版本的docker支持多级构build,可以将构build产品从容器复制到另一个。
https://docs.docker.com/engine/userguide/eng-image/multistage-build/
创build一个docker文件来运行你的构build过程,然后运行清理代码
例:
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"