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

标签 docker docker-multi-stage-build

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

1 个基于 C++ 的项目

2 基于 Nodejs 的项目

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

C++ 项目会生成一个节点绑定(bind)文件 .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 只允许 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

然后使用标签(在您的节点 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 根目录执行。

关于Docker 多阶段构建与不同的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51997002/

相关文章:

javascript - 错误! make ionic serve 命令失败(要求检查安装的 node.js 和 npm 的版本)

scala - 玩改RUNNING_PID文件路径

python - 如何检查 docker-compose up -d 命令的状态

Azure DevOps CI 构建器拉取访问被拒绝,存储库不存在或可能需要 'docker login'

python - 如何使用多阶段构建减小 python (docker) 图像大小?

python - 如何在多阶段 docker 构建期间将 python 从一个阶段复制到另一个阶段

dockerfile - 使用具有多阶段构建的 Dockerfile 为每个构建参数命名一个阶段

php - 如何通过phpMyAdmin连接到mysql docker容器?

docker - Docker如何通过相对路径作为参数

docker - 为什么docker-compose build会运行我的步骤两次?