这里的码头工具新手。我按照here的说明做了一个苗条的&修剪我的Go项目的容器。我不完全明白它在做什么,希望有人可以启发我。
具体来说,生成此docker容器有两个步骤。
score_month = TO_DATE('01-SEP-2017', 'dd-MON-yyyy')`
docker run --rm -it -v "$GOPATH":/gopath -v "$(pwd)":/app -e "GOPATH=/gopath" -w /app golang:1.8 sh -c 'CGO_ENABLED=0 go build -a --installsuffix cgo --ldflags="-s" -o hello'
DockerFile本身只包含
docker build -t myDockerImageName .
我理解(从广义上讲)第一步是编译go程序并静态链接C依赖项(并在未命名的docker容器中完成所有这些)。第二步只是根据DockerFile中的说明生成docker镜像。
我不明白为什么第一个命令以FROM iron/base
WORKDIR /app
COPY hello /app/
ENTRYPOINT ["./hello"]
开头(为什么它需要在docker容器中运行?为什么我们不只是在它之外生成Go二进制文件,然后复制它在?)
如果它是在docker容器中运行的,那么docker容器中生成的二进制文件如何被删除到我本地机器的文件系统上?(例如,为什么我需要将二进制文件复制回映像中 - 因为它似乎是在DockerFile的第3行做什么?)
答案 0 :(得分:2)
您实际上正在使用2个不同的泊坞容器,每个容器都有不同的图像。第一个容器只在编译期间...它使用图像golang:1.8。您正在做的是将当前工作目录挂载到该映像中,并使用映像中包含的GO版本对其进行编译。
第二个命令构建使用铁/基础图像作为基础的自定义图像。然后,将构建的应用程序复制到该映像中并运行它。
答案 1 :(得分:1)
使用golang容器来构建二进制文件通常是为了构建过程的可重复性,即:
这样,可以在版本控制系统中跟踪构建“hello”图像所需的所有部分。
然而,这个例子安装了整个本地GOPATH,击败了上述目的。依赖关系必须可用于构建容器,例如通过出售它们。也许作者认为他的例子超出了范围。
(注意:这应该是评论,但我的声誉不允许)