这里是码头工人的新手。我按照here的指示为我的Go项目制作了一个纤细的&装饰容器。我不完全理解它在做什么,希望有人能够启发我。这个Docker命令如何生成一个小GoLang容器?
具体来说有两个步骤来生成这个码头集装箱。
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'
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行上做什么?)
你安装你的本地目录,用'-v'标志卷。参见docker run --help输出。另外,没有C依赖关系,你有'CGO_ENABLED = 0'。 – JimB
任何你知道为什么需要CGO_ENABLED = 0标志的机会呢?(在能够最小化最终码头容器输出的情况下) – nciao
'CGO_ENABLED = 0'和'-a --installsuffix'确保_nothing_是使用cgo构建的,以便生成的二进制文件不被链接到任何特定版本的libc。 – JimB