繁体   English   中英

解决 Docker 容器中的 Go 依赖

[英]Resolving Go dependencies in Docker container

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

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

有没有办法用最新版本的主包依赖项和其他依赖项的锁定版本来构建应用程序?

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

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

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

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

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

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

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

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

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

我应该如何在 Go 1.6 中使用供应商?

如果您只关心能够从 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM