5

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

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

4

3 回答 3

4

您将有两个选项,因为限制因素是 Docker 只允许从与 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 允许从外部容器复制为 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 根目录执行。

于 2018-09-04T08:28:12.753 回答
3

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

使用git submodules创建部署项目怎么样?

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

由于您不只是复制这两个项目,而是使用 git 管理它们,因此您始终可以使用 使它们保持最新git submodules update --remote,但请注意,这会使您的子模块处于分离的头部状态。但是,只要您不尝试从部署项目更新您的 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/
于 2018-09-04T07:06:40.867 回答
1

您可以使用 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
于 2018-09-04T07:26:32.413 回答