Skip to content

快速参考

  • 由……维护: (注:原文中“Maintained by:”后面应该会有具体的维护者信息,若有完整内容,翻译会更加准确。这里仅根据给定的部分进行了翻译。)
    Docker 社区

  • 哪里可以获得帮助:
    Docker 社区 Slack、Server Fault、Unix & Linux 或 Stack Overflow

支持的标签及各自的 Dockerfile 链接

(在常见问题解答中查看“‘共享’标签和‘简单’标签之间的区别是什么?”)

简单标签

共享标签

快速参考(续)

什么是 Go?

Go(又名 Golang)是一种最初在谷歌开发的编程语言。它是一种静态类型语言,语法大致源自 C,但具有其他功能,如垃圾回收、类型安全、一些动态类型功能、其他内置类型(例如,可变长度数组和键值映射)以及一个大型标准库。

wikipedia.org/wiki/Go(编程语言)

logo

如何使用此图像

注意: /go 是世界可写的,以便在运行容器的用户中具有灵活性(例如,在以 --user 1000:1000 启动的容器中,在默认的 $GOPATH 中运行 go get github.com/example/... 将成功)。虽然在常规主机设置中 777 目录是不安全的,但容器内通常没有其他进程或用户,因此对于 Docker 使用来说,这相当于 700 ,但允许 --user 的灵活性。

在您的应用程序中启动一个 Go 实例

使用此图像的最直接方法是将 Go 容器同时用作构建和运行时环境。在您的 Dockerfile 中,编写类似于以下内容的内容将编译并运行您的项目(假设它使用 go.mod 进行依赖管理):

FROM golang:1.23

WORKDIR /usr/src/app

# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change
COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .
RUN go build -v -o /usr/local/bin/app ./...

CMD ["app"]

然后您可以构建并运行 Docker 镜像:

$ docker build -t my-golang-app .
$ docker run -it --rm --name my-running-app my-golang-app

在 Docker 容器内编译您的应用程序

在某些情况下,在容器内运行您的应用程序可能并不合适。若要在 Docker 实例内编译但不运行您的应用程序,您可以编写如下内容:

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.23 go build -v

这会将您当前的目录作为卷添加到容器中,将工作目录设置为该卷,并运行命令 go build ,该命令将告知 go 在工作目录中编译项目并将可执行文件输出到 myapp 。或者,如果您有 Makefile ,则可以在您的容器内运行 make 命令。

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.23 make

在 Docker 容器内交叉编译您的应用程序

如果您需要为除 linux/amd64 以外的平台(例如 windows/386 )编译您的应用程序:

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.23 go build -v

或者,您可以一次为多个平台进行构建:

$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.23 bash
$ for GOOS in darwin linux; do
>   for GOARCH in 386 amd64; do
>     export GOOS GOARCH
>     go build -v -o myapp-$GOOS-$GOARCH
>   done
> done

Git 大文件存储(Git Large File Storage)

如果下载依赖项时出现诸如“校验和不匹配”之类的错误,您应该检查它们是否使用 Git LFS(因此需要安装它才能下载并计算正确的 go.sum 值)。

图像变体

golang 图像有多种类型,每种都针对特定的用例而设计。

golang:<version>

这是事实上的映像。如果您不确定自己的需求是什么,您可能想要使用这个。它被设计为既可以用作一次性容器(挂载您的源代码并启动容器以启动您的应用程序),也可以作为构建其他映像的基础。

其中一些标签的名称可能包含诸如“书虫”或“靶心”之类的名称。这些是 Debian 发行版的套件代号,表明该映像基于哪个发行版。如果您的映像需要安装除映像自带的软件包之外的任何其他软件包,您可能需要明确指定其中之一,以在 Debian 有新发行版时最大程度地减少损坏。

golang:<version>-alpine

此图像基于流行的 Alpine Linux 项目,可在 alpine 官方镜像中获取。Alpine Linux 比大多数发行版基础镜像(约 5MB)小得多,因此总体上会生成更精简的镜像。

此变体具有高度实验性,且未得到 Go 项目的官方支持(详情请见 golang/go#19938)。

需要注意的主要警告是,它确实使用 musl libc 而不是 glibc 及相关库,这可能会导致意外行为。有关可能出现的问题以及使用基于 Alpine 的镜像的一些利弊比较的更多讨论,请参阅此 Hacker News 评论线程。

为了最小化镜像大小,基于 Alpine 的镜像中不包含其他相关工具(例如 gitgccbash )。将此镜像作为基础,在您自己的 Dockerfile 中添加您需要的内容(如果您不熟悉,可查看 alpine 镜像描述中有关如何安装软件包的示例)。另请参阅 docker-library/golang#250(评论)以获取更详细的解释。

golang:<version>-windowsservercore

此图像基于 Windows Server Core( microsoft/windowsservercore )。因此,它仅在该图像适用的地方起作用,例如 Windows 10 专业版/企业版(周年纪念版)或 Windows Server 2016。

有关如何在 Windows 上运行 Docker 的信息,请参阅 Microsoft 提供的相关“快速入门”指南:

许可证

查看此映像中所包含软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可信息可能会在 repo-info 存储库的 golang/ 目录中找到。

对于任何预构建图像的使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。