有没有办法跨 monorepo 共享 Dockerfile 操作

Is there a way to share Dockerfile operations across a monorepo

所以我有一个应用程序,它包含 4 个 API 和一个前端,全部保存在 monorepo 上。 一切都用 docker 设置,每个服务都有自己的 Dockerfile。 文件结构如下所示:

project
│   README.md
│   docker-compose.yml
│
└───api1
│   │   src
|   |   ...
│   │   Dockerfile
│   
└───api2
│   │   src
│   │   ...
│   │   Dockerfile
│   
└───api3
|   │   src
|   │   ...
...

一切正常。 API Dockerfile 看起来像这样:

FROM some_image as deployment
EXPOSE xxxx/tcp

COPY ...

RUN apk add --no-cache curl~7.80 ...

...

CMD [...]

现在我会有 curl~7.80 之类的东西以及 api 1-3 中需要的其他软件包。
我的问题是,是否有某种方式可以在我的服务中共享这个包 and/or 整个 运行 操作,以便我可以在一个地方修改它?

例如,如果 curl~7.80 中碰巧有一个假设漏洞在 7.90 中得到修复,我希望能够在一个地方修改版本,而不是遍历所有文件夹和所有 Dockerfile 来更改它.

is there some way to share this package and/or this whole RUN operation across my services in a way so that I can modify this in one place instead?

是的,您可以通过按如下方式构建项目来实现此目的:

project
│   README.md
│   docker-compose.yml
│
└───api1
│   │   src
│   │    ...
│   │   Dockerfile
│   
└───...
│
│
│
│___common/
    │   dependencies.txt

common 文件夹中,然后你可以放置一个列出依赖项的文本文件(或直接 shell 脚本),然后你可以在 Dockerfiles 中使用它:

FROM some_image as deployment
EXPOSE xxxx/tcp

COPY common/dependencies.txt .
RUN apk add `cat dependencies.txt`
...

其中 project/common/dependencies.txt 包含:

curl~7.80

注意: 这显然意味着需要从 project 目录构建 Dockerfile,例如:

docker build -f api1/Dockerfile .