在 Docker 构建期间使用 git 子模块

Max*_*mar 8 git docker

我正在构建一个具有几种不同服务的应用程序。我正在使用 docker 和 docker-compose 来构建所有服务。然而,我需要在服务之间共享一些代码,特别是 ORM 代码。我的问题是,当我尝试致电时git submodule update --init出现以下错误:

Step 6/8 : RUN git submodule update --init
 ---> Running in 88e2dcfa5b36
fatal: Not a git repository: ../.git/modules/my-repo
ERROR: Service 'my-repo' failed to build: The command '/bin/sh -c git submodule update --init' returned a non-zero code: 128
Run Code Online (Sandbox Code Playgroud)

我不确定它为什么要查找../目录.git。我很确定我设置WORKDIR正确。这是我的全部Dockerfile

FROM node
WORKDIR /usr/src/my-repo
COPY package*.json ./
RUN npm install
COPY . .
RUN git submodule update --init
RUN git submodule foreach npm install
CMD ["npm", "start"]
Run Code Online (Sandbox Code Playgroud)

另外作为旁注 - 子模块是一个私有存储库,我如何使用 SSH 克隆它?我必须使用 ssh 密钥或其他东西来设置 docker 吗?谢谢。

编辑:此外,每个服务都是父项目的子模块。我认为这可能就是 git 正在寻找的原因../git/modules/my-repo,但我不太确定如何解决这个问题。我的目录结构是这样的:

parent-repo
--service-1
----orm
--service-2
----orm
Run Code Online (Sandbox Code Playgroud)

mbu*_*ann 9

总结一下:

  • 您有一个处理编排的目录
  • 在该目录中,您有多个项目,其中包含一个节点应用程序
  • 每个节点应用程序对 orm 库具有相同的依赖关系

我有一个类似的设置,但没有使用子模块。这只是一个建议,但对于拥有大约 20 名开发人员的团队来说效果非常好。您可以通过以下步骤修改当前设置:

  • 保留编排目录
  • 从该目录中删除所有子模块
  • 现在将编排目录中的每个服务克隆为普通的 git 存储库。将每个目录添加到父项目的 .gitignore 文件中。
  • 在每个子项目中创建一个 Dockerfile 来为该服务构建一个容器。
  • 在父目录中,为 docker-compose 文件中的每个项目创建一个条目

现在你有这样的结构

- orchestration/
  - .git/
  - .gitignore
  - docker-compose.yaml
  - service1/
    - .git/
    - Dockerfile
    - package.json
    - ...
  - service2/
    - .git/
    - Dockerfile
    - package.json
    - ...
  - service3/
    - .git/
    - Dockerfile
    - package.json
    - ...
Run Code Online (Sandbox Code Playgroud)

你的docker-compose.yaml样子是这样的:

version: '3'

services:
  service1:
    build: ./service1
  service2:
    build: ./service2
  service3:
    build: ./service3
Run Code Online (Sandbox Code Playgroud)

为每个服务提供 orm 代码:

当您现在调用docker-compose updocker compose 时,应该构建每个项目并启动它。如果任何服务需要访问另一个服务,则该服务的 url 只是 docker-compose 文件中提供的名称。例如service1想要访问service2那么url是http://serive1/path

您不必启动所有服务,您可以根据需要启动它们,例如docker-compose up service1 service3

要重建服务(例如,当代码更改时),请调用:docker-compose restart service1