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

时间:2018-09-18 13:30:57

标签: 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

我不确定为什么要在../的{​​{1}}目录中查找它。我敢肯定我正确设置了.git。这是我的整个WORKDIR

Dockerfile

也要注意-子模块是一个私有存储库,我如何使用SSH克隆它?我是否必须使用ssh密钥或其他内容设置docker?谢谢。

编辑:同样,每个服务都是父项目的子模块。我认为这可能就是git在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"] 中查找内容的原因,但是我不确定如何解决这个问题。我的目录结构是这样的:

../git/modules/my-repo

1 个答案:

答案 0 :(得分:1)

总结:

  • 您有一个处理业务流程的目录
  • 在该目录中,您有多个项目,其中包含一个节点应用程序
  • 每个节点应用程序对orm lib具有相同的依赖性

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

  • 保留业务流程目录
  • 从该目录中删除所有子模块
  • 现在将业务流程目录中的每个服务克隆为普通的git repo。将每个目录添加到父项目的.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
    - ...

您的docker-compose.yaml如下所示:

version: '3'

services:
  service1:
    build: ./service1
  service2:
    build: ./service2
  service3:
    build: ./service3

为每个服务提供orm代码:

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

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

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