2017-09-15 21 views
0

这里是码头工人的新手。我按照here的指示为我的Go项目制作了一个纤细的&装饰容器。我不完全理解它在做什么,希望有人能够启发我。这个Docker命令如何生成一个小GoLang容器?

具体来说有两个步骤来生成这个码头集装箱。

  1. 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'
  2. docker build -t myDockerImageName .

的DockerFile本身只包含

FROM iron/base 
WORKDIR /app 
COPY hello /app/ 
ENTRYPOINT ["./hello"] 

我理解(广义上的)的第一个步骤是编译围棋程序和静态链接C依赖关系(并在一个未命名的docker容器中完成所有这些)。第二步根据DockerFile中的指令生成Docker镜像。

我不明白为什么第一个命令是以docker run开头的(为什么它需要在Docker容器中运行?为什么我们不只是在它外面生成Go二进制文件,然后将其复制进来? )

如果它在Docker容器中运行,Docker容器中的二进制文件如何在我的本地机器的文件系统上丢失?(例如,为什么我需要将二进制文件复制回映像 - 就像它似乎在DockerFile的第3行上做什么?)

+0

你安装你的本地目录,用'-v'标志卷。参见docker run --help输出。另外,没有C依赖关系,你有'CGO_ENABLED = 0'。 – JimB

+0

任何你知道为什么需要CGO_ENABLED = 0标志的机会呢?(在能够最小化最终码头容器输出的情况下) – nciao

+0

'CGO_ENABLED = 0'和'-a --installsuffix'确保_nothing_是使用cgo构建的,以便生成的二进制文件不被链接到任何特定版本的libc。 – JimB

回答

2

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

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

+0

你知道我们为什么需要使用一个临时码头容器进行编译吗? (而不是仅仅编译它 - 没有临时的docker容器)? – nciao

+0

@nciao:你不知道。这只是一个例子。 – JimB

1

使用golang容器构建二进制,则通常用于构建过程的可重复性,即:

  • 它可以确保始终使用相同的围棋版本,
  • 汇编发生在一个送花儿给人清洁的环境,
  • 和构建主机不需要去安装在所有的,或者可以有不同的版本,

这种方式,打造的“你好”图像CA所需的全部零件n在版本控制系统中被跟踪。

但是,这个例子装载了整个本地GOPATH,击败了上述目的。构建容器必须具有相关性,例如,通过售卖他们。也许作者认为他的示例超出了范围。

(注:这应该是一个评论,但我的名誉不允许)

+0

是的,你只需要潜伏一段时间,然后oyu获得足够的评论。看到这里就代表提示:https://meta.stackexchange.com/questions/139661/how-to-get-initial-reputation-on-stack-overflow-with-the-new-user-restrictions-i – jdv

+0

是它可以把所有的音量安装(或者,只是拉我的滑翔依赖)和建设步入DockerFile本身? (所以构建Docker镜像也会在其内部构建Go二进制文件)? – nciao

+0

的构建步骤是,但安装没有。 Dockerfile VOLUME命令仅在容器内创建装载点。但是你可以使用泊坞窗,撰写了点。 – AleGra

相关问题