我想在 Docker 镜像构建期间构建我的 Go 应用程序,并将镜像入口点设置为构建的 Go 应用程序。问题是我的 Go 应用程序是主包的子包,并使用了主包中的一些其他子模块。这个主包在 Github 上作为私有(private)存储库,所以我不能只是 go get
进入容器。
我已经尝试设置 Glide 依赖管理器并将容器外的所有依赖项放入 vendor/
目录,但还有另一个问题 - glide.lock 必须在每次提交后更新主要的私有(private)存储库。这不是我的解决方案,因为我想锁定其他依赖项。
有什么方法可以使用最新版本的主包依赖项和锁定版本的其他依赖项来构建应用程序?
最佳答案
这不是一道围棋题。这是一个 Docker 和安全问题。
首先,构建 Go 应用程序作为构建的一部分并不理想。通常,您会在您的机器上以您设置的 Dockerfile FROM
为目标构建二进制文件。没有理由不这样做,因为每台机器都有一个 Go 编译器,您可以将 GOOS 和 GOARCH 定位到任何机器。
但是对于您的用例,使用私有(private)存储库,更重要的是不要在您的容器中构建,因为无论您如何将代码放入容器中进行构建,您都会拥有一个包含私有(private)文件的容器,或者更糟的是您的 key 。您必须在某处上传、托管和运行的容器。
不管你怎么看,这都不理想。
但是,如果您决定泄露您的代码和/或 key ,您只有两个选择:
git clone
您本地/构建机器上的私有(private)仓库 yhat 被授权访问私有(private)仓库并在您的 Dockerfile 中使用COPY
复制它。使用 Dockerfile
COPY
将您为远程仓库授权的本地计算机的 SSH key 复制到容器中,以便您可以运行 git 命令(您还需要 git并安装了 ssh)。
同样,这些并不理想。在本地构建 Go 应用程序,定位容器的类型,然后复制二进制文件。这真的再简单不过了。
至于依赖管理,我没用过glide;但是,我用 /vendor
写了一个关于版本依赖的流行答案。
关于git - 解决 Docker 容器中的 Go 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959005/