穿插编译

首先,在我的项目的根目录( main.go 所在目录 )下执行以下命令进行穿插编译:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

若编译胜利,根目录下将生成一个以我的项目名为文件名的二进制可执行文件。

编写Dockerfile

假如项目名称为service

# syntax=docker/dockerfile:1FROM alpineWORKDIR /appCOPY service /appCMD ["./service"]

构建Docker镜像

docker build -t service:latest .

启动容器

docker run -d service:latest

Docker Hub

若需部署到近程服务器,则需通过Docker Hub直达镜像。

Docker Hub定义了镜像的提交标准:

account/repository:tag

所以编译时的项目名称和标签须从新指定:

docker build -t account/repository:service .

构建实现后推送至Docker Hub

docker push account/repository:service

近程服务器拉取镜像:

docker pull account/repository:service

bash

alpine镜像的默认shellsh,若要反对bash,须在镜像构建时手动增加:

# syntax=docker/dockerfile:1FROM alpineWORKDIR /appRUN apk update \    && apk upgrade \    && apk add --no-cache bash \    && rm -rf /var/cache/apk/*COPY service /appCMD ["./service"]

时区

alpine镜像的默认时区是UTC,若要固定为CST,须在镜像构建时手动增加:

# syntax=docker/dockerfile:1FROM alpineWORKDIR /appRUN apk update \    && apk upgrade \    && apk add --no-cache tzdata \    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \    && echo Asia/Shanghai > /etc/timezone \    && apk del tzdata \    && rm -rf /var/cache/apk/*COPY service /appCMD ["./service"]

自定义根底镜像

综上所述,当咱们须要一个反对bash且时区为CST的镜像时,能够这样编写Dockerfile

# syntax=docker/dockerfile:1FROM alpineWORKDIR /appRUN apk update \    && apk upgrade \    && apk add --no-cache tzdata \    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \    && echo Asia/Shanghai > /etc/timezone \    && apk del tzdata \    && rm -rf /var/cache/apk/*COPY service /appCMD ["./service"]

上述写法曾经满足需要,但apk包的下载和装置须要工夫,尤其是上面这两个阶段:

fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gzfetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz

大部分状况下这个工夫都不会太短(至多须要几百秒,有些状况下甚至须要几十分钟)。

很显然,每次部署都要期待这个工夫是不可承受的。

咱们能够在alpine的根底上,退出bash和时区层,而后独自提交一个新镜像,后续业务再基于该新镜像进行构建。

如此一来,apk的装置等待时间,只需忍耐一次。

首先,编写根底镜像Dockerfile

# syntax=docker/dockerfile:1FROM alpineRUN apk update \    && apk upgrade \    && apk add --no-cache bash \    && apk add --no-cache tzdata \    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \    && echo Asia/Shanghai > /etc/timezone \    && apk del tzdata \    && rm -rf /var/cache/apk/*

其次,构建根底镜像

docker build -t account/repository:base .

而后,推送至Docker Hub

docker push account/repository:base

最初,基于根底镜像构建业务镜像

# syntax=docker/dockerfile:1FROM account/repository:baseWORKDIR /appCOPY service /appCMD ["./service"]

Compile go packages and dependencies
Dockerfile
Docker Hub