如何通过多个分离的项目对monolith应用进行docker化?

时间:2019-04-07 15:16:19

标签: docker containers dockerfile

我想在提交更改后使用我的整体应用程序的docker映像来测试我的应用程序。我在单独的解决方案中有一个Web应用程序项目和许多库项目(不是应用程序项目!),这些项目的输出将复制到应用程序的bin所放置的路径并使我的应用程序可执行。

我的源代码结构如下:

|--Master_Web_App.sln
|     |
|     app.csproj
|
|--projectA.sln
|      | 
|      projectA-1.csproj 
|      | 
|      projectA-2.csproj 
| 
|--projectB.sln 
      | 
      projectB-1.csproj 
      | 
      projectB-2.csproj 

构建每个项目后,我将其输出复制到网站定义的物理路径:

wwwroot
|--app
    |
    bin
      |
      app.dll
      projectA-1.dll
      projectA-2.dll
      projectB-1.dll
      projectB-2.dll

我创建了一个基本的docker镜像来运行我的应用程序。  当特定项目(例如projectA-1)发生更改时,我想创建一个仅将projectA-1的输出复制到目标文件夹的docker映像FROM baseIamge

假设:

    我应该有一个用于项目更改的单一docker映像。 (因为 我有一个单一应用程序)
  1. 项目分开放置,但属于 一个Web应用程序。
  2. 我要创建的图像仅包含基础的更改 图片。

什么是最佳做法?

我打算在每个项目的根目录中创建一个 Dockerfile ,并创建一个工具来合并所有这些Dockerfile(每次提交更改并由开发人员选择更改的项目),然后制作一个单件但多件的上演Dockerfile! 因此Docker Build的结果将是包含所选项目输出的映像,并且COPY dll将成为基本映像。但是我不确定以编程方式生成Dockerfile文本是否是一种好方法。

1 个答案:

答案 0 :(得分:1)

在开发过程中,您将具有复杂的项目版本矩阵。

但是一种方法可能是将项目版本/分支作为参数传递给docker构建过程。创建自定义docker构建过程,您可以在其中构建多个项目,将其作为单独的docker映像每个项目一个。对于应用程序docker映像,Dockerfile使用多级生成器,并使用所有项目映像在相应目录中复制dll。

单独的图像,例如:

|--Master_Web_App.sln
|     |
|     app.csproj -> app-dockerimage
|
|--projectA.sln
|      | 
|      projectA-1.csproj  -> projectA-1-dockerimage
|      | 
|      projectA-2.csproj  -> projectA-2-dockerimage
| 
|--projectB.sln 
      | 
      projectB-1.csproj  -> projectB-1-dockerimage 
      | 
      projectB-2.csproj  -> projectB-2-dockerimage 

主要docker映像:

# app docker image
FROM projectA-1-dockerimage as projectA-1
FROM projectA-2-dockerimage as projectA-2
FROM projectB-1-dockerimage as projectB-1
FROM projectB-2-dockerimage as projectB-2

FROM BASE_IMAGE

# other steps
#Build process app.dll

COPY FROM --projectA-1 wwwroot/app/bin/projectA-1.dll
COPY FROM --projectA-2 wwwroot/app/bin/projectA-2.dll
COPY FROM --projectB-1 wwwroot/app/bin/projectB-1.dll
COPY FROM --projectB-2 wwwroot/app/bin/projectB-2.dll