build编译阶段
certs(可选,可有可无)证书认证阶段
prod生产阶段
1 #
2 # BUILD 阶段
3 #
4 FROM golang:1.10 AS build
5
6 # 设置我们应用程序的工作目录
7 WORKDIR /go/src/github/scboffspring/blog-multistage-go
8
9 # 添加所有需要编译的应用代码
10 ADD . .
11
12 # 编译一个静态的go应用(在二进制构建中包含C语言依赖库)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 设置我们应用程序的启动命令
16 CMD ["./blog-multistage-go"]
第4行:使用的基础镜像(golang:1.10)并且我们使用as给当前阶段一个别名,也可以使用阶段索引来引用前一阶段,但这使得它更清晰。
第7行:我们将工作目录设置为Golang基础镜像的默认$GOPATH中的应用程序目录。
第10行:添加我们的应用程序源文件。
第13行:编译二进制文件。使用不同的参数来创建一个完整的静态库,因为在生产环境拉取镜像时可能不一定需要所有的Golang VM以及C语言库。
第16行:使用设定的命令来启动应用程序。
我们可以使用curl命令来请求,并且它会返回。docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080
scboffspring/blog-multistage-go
让我们使用docker images,来看看镜像的大小:1 <html itemscope="" itemtype="" lang="de-CH">
2 <head>
3 <meta content="text/html; charset=UTF-8"
4 http-equiv="Content-Type">
5 <meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png"
6 itemprop="image"><title>Google</title>
7 ....
荒唐,太荒唐了,一个这么小的应用居然占了磁盘818M内存空间。REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 818MB
如你所见,同一个Dockerfile文件中我们添加了第二个FROM语句。这次,我们直接拉取二进制文件,不需要添加任何其他依赖。1 #
2 # BUILD 阶段
3 #
4 FROM golang:1.10 AS build
5
6 # 设置我们应用程序的工作目录
7 WORKDIR /go/src/github/scboffspring/blog-multistage-go
8
9 # 添加所有需要编译的应用代码
10 ADD . .
11
12 # 编译一个静态的go应用(在二进制构建中包含C语言依赖库)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 设置我们应用程序的启动命令
16 CMD ["./blog-multistage-go"]
17
18
19
20 #
21 # 生产阶段
22 #
23 FROM scratch AS prod
24
25 # 从buil阶段拷贝二进制文件
26 COPY --from=build /go/src/github/scboffspring/blog-multistage-go/blog-multistage-go .
27 CMD ["./blog-multistage-go"]
第23行:拉取基础镜像
第26行:从/go/src/github/scboffspring/blog-multistage-go/blog-multistage-go拷贝build阶段编译的文件
第27行:使用设定的命令来启动应用程序
我们可以看到 服务正常启动,也就是意味着它正确的启动了!我们完成了!docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080
scboffspring/blog-multistage-go
如我们之前所说,镜像的大小变为10MB以下。而且镜像被推送到镜像仓库后,它只有2MB。当你启动容器时,只需下载2MB即可,相比于之前节省了大量的时间和带宽呢。REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 6.65MB
如果你查看容器的日志,你可以找到如下错误:发生了一个错误:Get :X509:加载系统根目录失败并且没有根目录可以使用。我们尝试使用https来连接Goole服务器,但是我们没有用于验证Google的SSL证书的CA(证书颁发机构)证书或是其他网站的CA证书。如果你的应用不需要使用SSL的话,可以选择跳到下一节,否则,让我们来改善我们的软件使得其可以进行访问。curl localhost:8080
500 - Something bad happened
1 #
2 # BUILD 阶段
3 #
4 FROM golang:1.10 AS build
5
6 # 设置我们应用程序的工作目录
7 WORKDIR /go/src/github/scboffspring/blog-multistage-go
8
9 # 添加所有需要编译的应用代码
10 ADD . .
11
12 # 编译一个静态的go应用(在二进制构建中包含C语言依赖库)
13 RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo .
14
15 # 设置我们应用程序的启动命令
16 CMD ["./blog-multistage-go"]
17
18
19 #
20 # CERTS Stage
21 #
22 FROM alpine:latest as certs
23
24 # Install the CA certificates
25 RUN apk --update add ca-certificates
26
27 #
28 # PRODUCTION STAGE
29 #
30 FROM scratch AS prod
31
32 # 从certs阶段拷贝CA证书
33 COPY --from=certs /etc/ssl/ /etc/ssl/
34 # 从buil阶段拷贝二进制文件
35 COPY --from=build /go/src/github/scboffspring/blog-multistage-go/blog-multistage-go .
36 CMD ["./blog-multistage-go"]
第23行:我们新的certs阶段,使用alpine镜像
第25行:安装最新版的CA证书
第33行:从certs层拷贝证书,并保存为/etc/ssl/
现在,curl localhost:8080将会返回真实的页面!它真的奏效了!docker build -t scboffspring/blog-multistage-go .
docker run --rm -ti -p 8080:8080
scboffspring/blog-multistage-go
REPOSITORY ... SIZE
scboffspring/blog-multistage-go ... 6.89MB
总结docker build -t scboffspring/blog-multistage-go:build . --target=build
本文发布于:2024-02-04 06:10:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170700732652977.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |