这个生成小型GoLang容器的Docker命令如何工作?

时间:2017-09-15 13:47:51

标签: docker go

这里的码头工具新手。我按照here的说明做了一个苗条的&修剪我的Go项目的容器。我不完全明白它在做什么,希望有人可以启发我。

具体来说,生成此docker容器有两个步骤。

  1. score_month = TO_DATE('01-SEP-2017', 'dd-MON-yyyy')`
  2. 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'
  3. 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行做什么?)

2 个答案:

答案 0 :(得分:2)

您实际上正在使用2个不同的泊坞容器,每个容器都有不同的图像。第一个容器只在编译期间...它使用图像golang:1.8。您正在做的是将当前工作目录挂载到该映像中,并使用映像中包含的GO版本对其进行编译。

第二个命令构建使用铁/基础图像作为基础的自定义图像。然后,将构建的应用程序复制到该映像中并运行它。

答案 1 :(得分:1)

使用golang容器来构建二进制文件通常是为了构建过程的可重复性,即:

  • 确保始终使用相同的Go版本,
  • 编译在一个干净的环境中进行,
  • 并且构建主机根本不需要安装Go,或者可以使用不同的版本,

这样,可以在版本控制系统中跟踪构建“hello”图像所需的所有部分。

然而,这个例子安装了整个本地GOPATH,击败了上述目的。依赖关系必须可用于构建容器,例如通过出售它们。也许作者认为他的例子超出了范围。

(注意:这应该是评论,但我的声誉不允许)