具有构建输出且没有源的Docker容器

时间:2016-09-29 16:47:47

标签: docker docker-compose

我有一个构建过程,可以将typescript转换为javascript,缩小和连接css文件等。

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

This page谈到以手动方式做类似的事情,但没有解释如何自动化该过程,例如与docker-compose或其他东西。

5 个答案:

答案 0 :(得分:3)

  1. 创建一个docker镜像,其中包含构建代码所需的所有工具,可以克隆代码并构建代码。构建后,它必须复制 例如,卷名称为/opt/webapp
  2. 在步骤1中使用构建映像启动构建docker容器

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

    docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name
    
  4. 构建并将构建代码发送到Appserver后。您可以删除BuildContainer,因为不再需要。

  5. 以上步骤的优势:

    1. 您的构建代码将在主机中,因此如果一个Appserver docker失败或停止,那么您的构建代码在主机中是安全的,您可以使用该构建代码启动新的docker。
    2. 如果您为构建代码创建了docker镜像,那么每次启动docker时都不需要安装所需的工具。
    3. 您也可以在主机上构建代码,但如果您希望每次都能在新环境中构建代码,那么这将是一件好事。或者如果每次使用相同的主机来构建/编译代码,那么一些较旧的源代码可能会产生问题或git clone错误等。
    4. 编辑:

      您可以将:ro(只读)附加到一个容器不会影响另一个容器的卷。您可以阅读有关docker volume Here的更多信息。感谢@BMitch的建议。

答案 1 :(得分:2)

最新版本的docker支持多阶段构建,可以将构建产品从容器复制到另一个容器。

https://docs.docker.com/engine/userguide/eng-image/multistage-build/

答案 2 :(得分:1)

两个常见选项:

  • 如上所述,您可以在外部构建并将编译结果复制到容器中。

  • 您将下载,构建和清理步骤合并到一个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

线条会比这复杂一点,但这就是要点。

答案 3 :(得分:0)

正如@dnephin在他对这个问题的评论和@ pl_rock的回答中所建议的那样,标准的docker工具不是为了这个而设计的,但你可以使用第三方工具,如下所示:

(当我写答案时,GitHub明星正确)

我们选择了dobi,因为它是我们听到的第一个(因为这个问题),但它看起来像打包机是最受欢迎的。

答案 4 :(得分:-1)

创建一个docker文件来运行构建过程,然后运行清理代码

示例:

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"