交叉编译

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

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

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

编写Dockerfile

假设项目名称为service

# syntax=docker/dockerfile:1
FROM alpine
WORKDIR /app
COPY service /app
CMD ["./service"]

构建Docker镜像

docker build -t service:latest .

启动容器

docker run -d service:latest

Docker Hub

若需部署到远程服务器,则需通过Docker Hub中转镜像。

Docker Hub定义了镜像的提交规范:

namespace/service:tag

相当于必须在镜像名称前带上自己的dockerID,为了push方便,可以在构建时直接指定:

docker build -t namespace/service:tag .

构建完成后推送至Docker Hub

docker push namespace/service:tag

远程服务器拉取镜像:

docker pull namespace/service:tag

bash

alpine镜像的默认shellsh,若要支持bash,须在镜像构建时手动添加:

# syntax=docker/dockerfile:1
FROM alpine
WORKDIR /app
RUN apk update \
    && apk upgrade \
    && apk add --no-cache bash \
    && rm -rf /var/cache/apk/*
COPY service /app
CMD ["./service"]

时区

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

# syntax=docker/dockerfile:1
FROM alpine
WORKDIR /app
RUN 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 /app
CMD ["./service"]

自定义基础镜像

综上所述,当我们需要一个支持bash且时区为CST的镜像时,可以这样编写Dockerfile

# syntax=docker/dockerfile:1
FROM alpine
WORKDIR /app
RUN 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 /app
CMD ["./service"]

上述写法已经满足需求,但apk包的下载和安装需要时间,尤其是下面这两个阶段:

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

大部分情况下这个时间都不会太短(至少需要几百秒,有些情况下甚至需要几十分钟)。

很显然,每次部署都要等待这个时间是不可接受的。

我们可以在alpine的基础上,加入bash和时区层,然后单独提交一个新镜像,后续业务再基于该新镜像进行构建。

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

首先,编写基础镜像Dockerfile

# syntax=docker/dockerfile:1
FROM alpine
RUN 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/base:latest .

然后,推送至Docker Hub

docker push account/base:latest

最后,基于基础镜像构建业务镜像

# syntax=docker/dockerfile:1
FROM account/base
WORKDIR /app
COPY service /app
CMD ["./service"]

Compile go packages and dependencies
Dockerfile
Docker Hub

从君华
136 声望7 粉丝

万物之中,简洁最美。