如何构建 Go 应用的 Docker 镜像 您所在的位置:网站首页 制作docker镜像 如何构建 Go 应用的 Docker 镜像

如何构建 Go 应用的 Docker 镜像

2024-01-19 15:47| 来源: 网络整理| 查看: 265

在部署 Go 应用时,我们通常会使用 Docker 镜像来部署,那么如何构建一个 Go 应用的 Docker 镜像呢?镜像构建过程中有没有什么最佳实践呢?

这正是本文想要讲解的内容。总的来说,本文会包含 Dockerfile 编写、镜像构建、多阶段构建、交叉编译以及使用 Makefile 简化构建流程等知识点。

创建一个简单的 Go 应用

为了说明整个镜像构建流程,让我们先从一个简单的 Go REST 应用开始。

该应用主要有以下功能:

访问 /,返回 Hello, Docker! => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => resolve image config for docker.io/docker/dockerfile:1 15.2s => CACHED docker-image://docker.io/docker/dockerfile:1@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a61324cfdf59ef1357b3b2 0.0s => [internal] load build definition from Dockerfile 0.0s => [internal] load .dockerignore 0.0s => [internal] load metadata for docker.io/library/golang:1.16-alpine 15.6s => [1/7] FROM docker.io/library/golang:1.16-alpine@sha256:45412fe3f5016509fc448b83faefc34e6f9e9bcc8ca1db1c54505d5528264e16 0.0s => [internal] load build context 0.1s => => transferring context: 80B 0.0s => CACHED [2/7] WORKDIR /app 0.0s => CACHED [3/7] COPY go.mod ./ 0.0s => CACHED [4/7] COPY go.sum ./ 0.0s => CACHED [5/7] RUN go mod download 0.0s => CACHED [6/7] COPY *.go ./ 0.0s => CACHED [7/7] RUN go build -o /docker-go-server-ping 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => writing image sha256:17fa05342ccef20e73abc48210fff449cc49683ffd817ccc6aef35500cf91ae2 0.0s => => naming to docker.io/library/docker-go-server-ping

构建完成后可以通过 docker image ls (或 docker images 简写)来查看镜像列表:

$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker-go-server-ping latest 17fa05342cce 9 minutes ago 407MB 为镜像设置标签

我们也可以通过 docker image tag 命令来为镜像设置新的标签,例如:

$ docker image tag docker-go-server-ping:latest docker-go-server-ping:v1.0.0

这时通过 docker image ls 就可以看到 docker-go-server-ping 镜像的两个标签:

$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker-go-server-ping latest 17fa05342cce 12 minutes ago 407MB docker-go-server-ping v1.0.0 17fa05342cce 1 minutes ago 407MB

我们还可以通过 docker image rm (简写为 docker rmi)删除镜像:

$ docker image rm docker-go-server-ping:v1.0.0 Untagged: docker-go-server-ping:v1.0.0

这时再查看镜像列表,v1.0.0 版本的镜像已被删除,只剩下 latest 版本了:

$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker-go-server-ping latest 17fa05342cce 15 minutes ago 407MB 单元测试

既然本文主要将 Go 的 Docker 镜像,这样就顺便简单说明如何使用 dockertest 对 Go 应用进行单元测试。

dockertest 可以在 Docker 容器中启动 Go 应用镜像并执行测试用例。

相关测试用例可以参考 main_test.go 。

在 main_test.go 中我们使用了 docker-go-server-ping:latest 镜像来运行 Go 应用:

resource, err := pool.Run("docker-go-server-ping", "latest", []string{})

所以在执行 go test 之前,需要先构建 docker-go-server-ping:latest 镜像:

$ docker build --tag docker-go-server-ping:latest . ... $ go test -v ./ === RUN TestRespondsWithLove body Hello, Docker!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有