【问题标题】:Docker multi-stage-build with different projectDocker 多阶段构建与不同的项目
【发布时间】:2018-08-24 03:23:57
【问题描述】:

我们目前正在处理两个项目:

1 个基于 C++ 的项目

2 基于 Nodejs 的项目

这两个项目是分开的,这意味着它们有不同的代码库(git repository)和工作目录。

C++ 项目将生成一个节点绑定文件.node,Nodejs 项目将使用该文件。

我们尝试为 Nodejs 项目构建一个多阶段的 docker 镜像,如下所示:

from ubuntu:18.04 as u
WORKDIR /app
RUN apt-get........  
copy (?) .  #1 copy the c++ source codes
RUN make  

from node:10
WORKDIR /app
copy (?) .  #1 copy the nodejs cource codes
RUN npm install
copy --from=u /app/dist/xx.node ./lib/
node index.js

我将通过docker build -t xx (?) #2 构建图像。

然而,正如 dockerfile 和命令中所评论的那样,如何设置 context 目录(参见评论 #2)?因为它会影响 dockerfile 中的路径(参见注释 #1)。

还有我应该为上面的dockerfile放入哪个项目?

【问题讨论】:

    标签: docker docker-multi-stage-build


    【解决方案1】:

    您将有两种选择,因为限制因素是 Docker 只允许copying from the same directory as the Dockerfile

    创建一个新的存储库

    您可以创建一个新的存储库并将您的存储库用作子模块或仅用于 Dockerfile(而不是您必须在构建时将两个存储库复制到根文件夹中)。最后你要实现的是如下结构:

    / (root)
    |-- C-plus-plus-Repo
    |-- |-- <Files>
    |-- Node-Repo
    |-- |-- <Files>
    |-- Dockerfile
    

    您可以使用以下方式构建您的项目:

    from ubuntu:18.04 as u
    WORKDIR /app
    RUN apt-get........  
    #1 copy the c++ source files
    copy ./C-plus-plus-Repo .
    RUN make  
    
    from node:10
    WORKDIR /app
    #1 copy the nodejs cource codes
    copy ./Node-Repo .  
    RUN npm install
    copy --from=u /app/dist/xx.node ./lib/
    node index.js   
    

    在根目录执行:

    docker build -t xx . 
    

    额外构建临时容器

    Docker 允许copy from an external container as stage

    因此您可以在 C++ 存储库根目录中构建 C++ 容器

    from ubuntu:18.04 as u
    WORKDIR /app
    RUN apt-get........  
    #1 copy the c++ source files
    copy . .  
    RUN make  
    

    并标记它:

    # Build your C++ Container in root of the c++ repo
    docker build . -t c-stage
    

    然后使用标签(在您的节点回购根目录中)从中复制文件:

    from node:10
    WORKDIR /app
    #1 copy the nodejs source files
    copy . .  
    RUN npm install
    # Use the Tag-Name of the already build container "c-stage"
    copy --from=c-stage /app/dist/xx.node ./lib/
    node index.js
    

    这两个构建步骤都可以从它们各自的 repo 根目录执行。

    【讨论】:

    • 好吧,听起来把所有相关项目放在一起是唯一的方法。
    • 嗯,使用第二种变体,您无需将它们放在一起即可。但是他们会相互依赖,这首先是不清楚的。所以把它们放在一起可能是一个很好的解决方案。
    【解决方案2】:

    使用 git 子模块创建部署项目

    如何使用git submodules 创建部署项目?

    该项目仅用于构建 docker 映像,包含 Dockerfile 和您的两个项目作为 git 子模块。

    由于您不只是复制这两个项目,而是使用 git 管理它们,因此您始终可以使用 git submodules update --remote 使它们保持最新,但请注意 this leaves your submodule in a detached head state。但是,只要您不尝试从部署项目更新您的 C++ 项目或节点项目,这不是问题。

    您可以使用以下命令创建项目:

    mkdir deploy_project && cd deploy_project
    git init
    git submodule add git@your-gitserver.com:YourName/YourCppProject.git cpp_project
    git submodule add git@your-gitserver.com:YourName/YourNodeProject.git nodejs_project
    

    然后您可以简单地将子项目的路径添加到您的 dockerfile 并在部署项目的根目录中构建映像。

    dockerfile 看起来像这样

    FROM ubuntu:18.04 as u
    WORKDIR /app
    RUN apt-get........  
    COPY cpp_project/ .  #1 copy the c++ source codes
    RUN make  
    
    FROM node:10
    WORKDIR /app
    COPY nodejs_project/ .  #1 copy the nodejs cource codes
    RUN npm install
    COPY --from=u /app/dist/xx.node ./lib/
    

    【讨论】:

      【解决方案3】:

      您可以使用 ADD 命令(她的上下文监视到放置 Dockerfile 的主机目录。它将与主机中的 Dockerfile 放置在同一目录中的所有内容(在本例中为 cpp_app 目录的内容)复制到 docker 容器中。

      ...
      ADD cpp_app /place/to/build
      WORKDIR /place/to/build
      RUN make
      RUN mv result_file /place/where/result_file/have/to/be
      WORKDIR /place/where/result_file/have/to/be
      ... execute your nodejs stuff
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-13
        • 2022-11-25
        • 2019-09-27
        • 1970-01-01
        • 2020-12-15
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        相关资源
        最近更新 更多