2016-12-04 124 views
-2

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

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

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

+0

https://blog.golang.org/docker这里是包装码头集装箱的好文章。您可以在DockerFile中定义应用程序的所有必需的子包和入口点 – ahankendi

+0

由于需要手动克隆到GOPATH或使用支持ssh的glide的私有存储库,因此这不起作用。另外我需要依赖版本锁定。 – kubaj

回答

0

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

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

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

不过你看它并不理想。

但是,如果你有决心会泄露你的代码和/或钥匙,你只有两种选择:

  • git clone在本地/构建机器yhat私人回购协议被授权访问私人回购协议并在你的Dockerfile中使用COPY来复制它。

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

再次,这些都不理想。在本地构建Go应用程序,定位容器的类型,然后复制二进制文件。这真的不容易。

至于依赖管理,我从来没有用过滑翔;但是,我写了一个关于/vendor版本依赖关系的流行答案。

How should I use vendor in Go 1.6?

0

如果你只关心能够从泊坞窗容器go get您的私人回购协议,不介意复制构建时你id_rsa,你可以添加到您的Dockerfile的开头:

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