Docker多阶段构建与不同的项目

问题描述 投票:5回答:3

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

1个基于C ++的项目

2基于Nodejs的项目

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

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
3个回答
4
投票

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

创建一个新的存储库

您可以创建一个新的repo并将您的repos用作子模块,也可以仅用于Dockerfile(在构建时,您必须将两个repos复制到根文件夹中)。在结束时,您想要实现的是以下结构:

/ (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 ++ Repo根目录中构建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

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

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根执行。


3
投票

使用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 [email protected]:YourName/YourCppProject.git cpp_project
git submodule add [email protected]:YourName/YourNodeProject.git nodejs_project

然后,您只需将子项目的路径添加到dockerfile,然后在deploy项目的根目录中构建映像。

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/

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
© www.soinside.com 2019 - 2024. All rights reserved.