穿插编译
首先,在我的项目的根目录(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
定义了镜像的提交标准:
account/repository:tag
所以编译时的项目名称和标签须从新指定:
docker build -t account/repository:service .
构建实现后推送至Docker Hub
:
docker push account/repository:service
近程服务器拉取镜像:
docker pull account/repository:service
bash
alpine
镜像的默认 shell
为sh
,若要反对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/repository:base .
而后,推送至Docker Hub
:
docker push account/repository:base
最初,基于根底镜像构建业务镜像:
# syntax=docker/dockerfile:1
FROM account/repository:base
WORKDIR /app
COPY service /app
CMD ["./service"]
Compile go packages and dependencies
Dockerfile
Docker Hub