【问题标题】:Docker Hub and git submodulesDocker Hub 和 git 子模块
【发布时间】:2019-06-01 00:18:24
【问题描述】:

我有一个使用 git 子模块的存储库,并且我在 Docker Hub 上配置了自动构建。在构建过程开始时,看起来 Docker Hub 从默认分支(master)拉取存储库,更新子模块,然后签出到触发构建的特定分支(比如说分支 feature-a)。如果 feature-a 分支具有与 master 完全相同的子模块,则它工作正常,但如果子模块不同(例如,从不同的 repo 中提取一个子模块),则构建失败。

有没有办法让 Docker Hub 直接克隆正确的分支?

【问题讨论】:

    标签: docker github dockerhub


    【解决方案1】:

    你需要使用钩子:https://docs.docker.com/docker-hub/builds/advanced/#custom-build-phase-hooks

    TL;DR: 把它放在hooks/post_checkout:

    #!/bin/bash
    # Docker hub does a recursive clone, then checks the branch out,
    # so when a PR adds a submodule (or updates it), it fails.
    git submodule update --init
    

    【讨论】:

    • 很好,感谢 Geod24,我认为这是正确的答案,我会尽快测试。
    【解决方案2】:

    它可能会失败,因为子模块是私有的。

    您可以添加构建环境变量SSH_PRIVATE。并添加一个可以访问私有子模块存储库的私钥。

    但请注意……您可能希望生成一个差异私钥,而不是用于其他任何内容的私钥,并将其添加到私有子模块存储库中。

    编辑:即使您链接的 github 帐户可以访问 repo,这也是必需的,因为您很可能将子模块 url 指定为基于 ssh(例如 git@github.com:Account/repo.git)

    Edit2:添加文档https://docs.docker.com/docker-hub/builds/#build-repositories-with-linked-private-submodules

    【讨论】:

    • 感谢 Clintm,但是子模块是公开的,您讨论的问题不是我面临的问题。
    【解决方案3】:

    SSH_PRIVATE Clintm 建议(在官方文档中)对我们不起作用。据我了解,这是因为设置环境变量的 Docker hub 接口不允许填写换行符(!?)

    我花了很多时间来寻找一种符合我们需求并且对我们有用的解决方法。
    如果它可以帮助你们中的一些人,我就放在这里。

    /hooks/post_checkout

    #!/bin/bash
    
    # Docker documentation to set up private git submodule for build does not work
    # since it's not possible to set environment variable with line break in Docker
    # Hub interface. It makes impossible to set SSH_PRIVATE as suggested here:
    # https://docs.docker.com/docker-hub/builds/#build-repositories-with-linked-private-submodules
    #
    # To use the script below:
    # - As suggested in the official doc, generate a keypair and push the public
    #   part to your source code provider account
    # - In Docker Hub build configuration, set var SSH_PRIVATE_ESCAPED with the output of
    #   `awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' /path/to/the/private/key`
    
    SSH_PRIVATE_FILE=~/git_id_rsa
    
    echo "${SSH_PRIVATE_ESCAPED}" | awk '{gsub(/\\n/,"\n")}1' > "${SSH_PRIVATE_FILE}"
    chmod 0400 "${SSH_PRIVATE_FILE}"
    export GIT_SSH_COMMAND="ssh -i ${SSH_PRIVATE_FILE}"
    
    git submodule update --init
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 2015-06-07
      • 1970-01-01
      • 2014-11-27
      • 2011-10-11
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多