【问题标题】:Resolving Go dependencies in Docker container解决 Docker 容器中的 Go 依赖项
【发布时间】:2017-04-18 22:42:13
【问题描述】:

我想在 Docker 镜像构建期间构建我的 Go 应用程序,并将镜像入口点设置为构建的 Go 应用程序。问题是我的 Go 应用程序是主包的子包,并使用了主包中的一些其他子模块。这个主包作为私有存储库在 Github 上,所以我不能只在容器内 go get

我尝试设置 Glide 依赖管理器并将容器外的所有依赖项放入 vendor/ 目录,但还有另一个问题 - glide.lock 必须在主私有存储库中的每次提交后更新。这对我来说不是解决方案,因为我想锁定其他依赖项。

有没有什么方法可以用最新版本的主包依赖和锁定版本的其他依赖来构建应用程序?

【问题讨论】:

  • blog.golang.org/docker 这是打包 docker 容器的好文章。您可以在 DockerFile 中定义应用程序的所有必需子包和入口点
  • 这不起作用,因为私有存储库需要手动克隆到 GOPATH 或使用支持 ssh 的 glide。我还需要锁定依赖版本。

标签: git go docker dependencies


【解决方案1】:

如果您只关心能够从 docker 容器中 go get 您的私有存储库,并且不介意在构建它时复制您的 id_rsa,您可以将其添加到 Dockerfile 的开头:

RUN echo "[url \"git@github.com:\"]\n\tinsteadOf = https://github.com/" >> /root/.gitconfig
RUN mkdir /root/.ssh && echo "StrictHostKeyChecking no " > /root/.ssh/config
COPY id_rsa /root/.ssh/id_rsa

【讨论】:

    【解决方案2】:

    这不是围棋问题。这是一个 Docker 和安全问题。

    首先,将 Go 应用程序作为构建的一部分进行构建并不理想。通常,您会在您的机器上本地构建二进制文件,目标是您设置的 Dockerfile FROM。没有理由不这样做,因为每台机器都有一个 Go 编译器,您可以将 GOOS 和 GOARCH 定位到任何机器。

    但是对于您的用例,使用私有存储库,更重要的是不要在容器中构建,因为无论您如何将代码放入容器中进行构建,您都将拥有一个包含私有文件或更糟的容器ssh 密钥。您必须上传并托管并在某处运行的容器。

    这并不理想,不管你怎么看。

    但是,如果您确定要泄露您的代码和/或密钥,您只有两个选择:

    • git clone 本地/构建机器上的私有仓库 yhat 有权访问私有仓库并在 ​​Dockerfile 中使用 COPY 复制它。

    • 使用 Dockerfile COPY 将您已授权用于远程存储库的本地计算机的 SSH 密钥复制到容器中,以便您可以运行 git 命令(您还需要安装 git 和 ssh)。

    同样,这些并不理想。在本地构建 Go 应用程序,定位容器的类型,然后复制二进制文件。真的再简单不过了。

    至于依赖管理,我从未使用过 glide;但是,我用/vendor 写了一个关于版本控制依赖的流行答案。

    How should I use vendor in Go 1.6?

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多