2016-09-29 62 views
2

我有打字稿转换成JavaScript,minifies并连接CSS文件生成过程,等泊坞容器与构建输出和无源

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

This page谈论了以手动方式做类似事情,但没有解释如何自动执行过程,例如与码头合成或什么的。

+0

使用'dobi'(免责声明,我是这个工具的作者)来自动完成这一过程的一个例子:https://github.com/dnephin/dobi/tree/master/examples/minimal-搬运工形象。 'dobi'就是为这些类型的任务而设计的。撰写不是专门为这类项目构建任务而设计的。 – dnephin

回答

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 

该线将是比这更复杂一点,但是这是要点。

+0

选项2似乎不可行。下载,构建,清理就像安装NodeJS,安装大量工具和依赖关系,然后再次卸载它们。 – rjmunro

+0

如果你不希望他们在图像中,但你希望你的图像完全自包含(只需在任何地方运行docker build),这是你的请求的唯一解决方案。选项1通常发生在静态链接的二进制文件中,您的构建只包括Docker外部和内部的两部分。独立的版本可能是一个码头容器,它在运行时通过主机卷输出其结果,然后用选项1将该结果导入到最终图像中。 – BMitch

-1

创建搬运工文件运行构建过程,然后运行清理代码

实施例:

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" 
+2

通过将其作为单独的RUN命令执行,可以创建包含所有构建包括工具,然后在下面的图层中删除它们。结果是,即使文件不再存在,图像也会更大并且需要更长时间才能通过网络发送。 – BMitch

3
  1. 创建具有搬运工图像所有需要的工具来构建您的代码,也可以克隆代码并构建它。构建完成后,必须将 复制到docker卷中,例如卷名为/opt/webapp。使用在步骤建立图像1

    docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name 
    
  2. ,将使用其中您的构建代码驻留构建搬运工的共享卷启动nginx搬运工容器

  3. 启动构建搬运工容器。

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

的上述步骤优势:

  1. 你的构建代码将在主机,所以如果一个泊坞窗失败或停止然后你构建代码将在主机的安全,你可以启动新码头工使用该构建代码。
  2. 如果您为构建代码创建docker映像,那么每次启动docker时都不需要安装所需的工具。
  3. 你也可以在主机上建立你的代码,但是如果你想让你的代码每次都在新鲜的环境中构建,那么这将会很好。或者如果使用同一台主机建立/编译代码每次然后一些较旧的源代码可能会产生问题,或者混帐克隆错误等

编辑:

可以追加:ro(只读)以一个容器不会影响另一个容器的容积。你可以阅读更多关于码头卷​​。感谢@BMitch提出建议。

+0

有趣的设计。如果这样做,考虑安装卷只读(附加':ro'到卷装),以便一个正在运行的容器不会影响另一个容器。 – BMitch

+1

你可以做一些非常相似的事情,而不用第二张图片的卷(本例中为“nginx”)。这样,编译后的工件就被包含在目标图像中,并可以随之分发。 https://github.com/dnephin/dobi/tree/master/examples/minimal-docker-image是如何使用'dobi'这个专门为这种事情创建的工具来做到这一点的一个例子。 – dnephin

+0

@dnephin你可以添加一个关于这个单独的答案。我们希望构建包含在图像中的产品,使其更加独立。我一直不得不告诉人们“看这个答案中的第二个评论”,而不是“看这个答案”。 – rjmunro

0

由于@dnephin在他的问题上@ pl_rock的答复意见认为,标准的搬运工工具没有被设计要做到这一点,但您可以使用第三方工具,如下列之一:

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

我们去用DOBI,因为它是我们听到的(因为这个问题)的第一个,但它看起来像打包机是最流行的。