Dockerfile的撰写方式 — 多阶段构建
Dockerfile 是什么?
这是一个用于定义Docker镜像内容的配置文件。如果您曾经使用过Vagrant,可以尝试回想起Vagrantfile,这样更容易理解。
主题
我们将使用https://github.com/tozastation/gRPC-Training-Golang来进行解释。这是关于构建API服务器的示例。
在Dockerfile中的步骤如下。
-
- 指定基本图像
-
- 安装程序所需的软件包
-
- 端口开放
- 启动程序的命令
Dockerfile(多阶段构建)
以下是Dockerfile的示例。
我认为有两个FROM语句。
这意味着我们正在获取两个镜像,但这是有原因的。
golang:latest镜像中包含Go的运行环境,但它占用了772MB的空间。将来,如果我们要频繁创建容器,我们希望尽量减少启动时间的开销。
因此,采用了多阶段构建(Multi Stage Build)的方法。
# Build Container
FROM golang:latest as builder
WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
COPY . .
# Set Environment Variable
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
# Build
RUN go build -o app main.go
# Runtime Container
FROM alpine
RUN apk add --no-cache ca-certificates
COPY --from=builder /go/src/github.com/tozastation/gRPC-Training-Golang/app /app
ENV CONNECTION_STRING=Data Source=127.0.0.1:1433;Initial Catalog=Weather;User ID=SA;Password=Test@1234
ENV VENDER=mssql
ENV OPENWEATHER_URL=http://api.openweathermap.org/data/2.5/weather
ENV OPENWEATHER_CREDENTIAL=&APPID=1e16e8941ce99bdd844d129d5179d98a
EXPOSE 3001
ENTRYPOINT ["/app"]
多阶段构建
只需要一个选项,将以下内容转化为中文:
通过从构建环境生成成品,并将只在执行时需要的成品移动到超轻的基础镜像中,可以将Docker镜像的容量最小化。刚才的golang:latest是772MB,但是这次创建的镜像只有21.2MB。非常惊人。
Go语言的兼容性
Go语言的编译会生成单一的二进制文件。
只需要携带一个文件,就可以运行该程序的环境已经准备好了。
不需要准备特殊的运行时包,只需要使用轻量级的Linux镜像alpine即可运行。
与Docker也非常兼容。
写作方法 (终于)
基本的Dockerfile的语法仅包括以下关键字。
如果您以前在Linux环境中使用过Shell命令,可能很容易理解。
按照可能使用的顺序进行编写。基本上可以用这些来创建,如果还想了解其他内容,请参考官方网站!
FROM ベースイメージの取得
# FROM golang:latest
WORKDIR 作業ディレクトリの指定(存在しない場合は自動で作ります.)
# WORKDIR /go/src/github.com/tozastation/gRPC-Training-Golang
ADD ローカルファイルをDockerイメージ内にコピーする(圧縮ファイルが自動解凍される)
# ADD: . .
COPY 同上(圧縮ファイルが自動解凍されない)
# COPY: . .
RUN Shellコマンドの実行
# RUN apt-get install -y vim
ENV 環境変数を定義
# ENV PORT=3306
EXPOSE 開放するポート番号
# EXPOSE 3306
ENTRYPOINT 実行するコマンドを指定
# ENTRYPOINT ["/app"]
※ Multi Stage Build在构建中需要的是,在构建和执行中使用两个FROM语句,以及使用COPY指令将生成的成果物复制到执行镜像中。由于这些操作都相对简单,因此不再详细解释。