具有构build输出且无源的Docker容器

我有一个构build过程,将打字稿转换为JavaScript,缩小和连接CSS文件等

我想把这些文件放到一个nginx的docker容器中,但是我不想把原始的javascript / css源文件包含进来,也不需要我用来构build它们的工具。 有没有一个很好的方法来做到这一点,或者我必须运行docker(或在一个单独定义的容器)之外的构build,然后复制相关的文件?

这个页面以手动的方式谈论了类似的事情,但是并没有解释如何使用docker-compose或者其他东西来自动化这个过程。

  1. 使用所有必需的工具创build一个Docker镜像,以构build代码,以克隆代码并构build它。 在构build之后,它必须复制到docker卷中,例如卷名是/opt/webapp
  2. 在步骤1中使用构build映像启动构build泊坞窗容器

     docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name 
  3. 启动将使用构build代码所在的构builddocker的共享卷的nginx docker容器。

     docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name 
  4. 在构build并将构build代码发送到Appserver之后。 你可以删除BuildContainer因为这是不需要的。

以上步骤的优点:

  1. 您的构build代码将在主机中,所以如果一个Appserver停靠器失败或停止,那么您的构build代码在主机中将是安全的,您可以使用该构build代码启动新的Docker。
  2. 如果您为构build代码创buildDocker镜像,则每次启动Docker时都不需要安装所需的工具。
  3. 你也可以在主机上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"