Docker部署Go极限优化

使用upx对二进制文件进行压缩后发布。效果更佳!

  • 创建目录 mkdir helloworld
  • 初始化项目 cd helloworld && go mod init helloworld && vi main.go
  • main.go
package main

import (
    "fmt"
    "net/http"
    "time"
)

func greet(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World! %s", time.Now())
}

func main() {
    http.HandleFunc("/", greet)
    http.ListenAndServe(":8080", nil)
}
# 基础镜像,基于golang的alpine镜像构建--编译阶段
FROM golang:alpine AS builder
# 作者
MAINTAINER korykim
# 全局工作目录
WORKDIR /go/myProject
# 把运行Dockerfile文件的当前目录所有文件复制到目标目录
COPY . /go/myProject
# 设置proxy环境变量,国内用户必选
ENV GOPROXY https://goproxy.cn,direct
# 安装UPX压缩壳
RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
    && apk add --no-cache upx

# 编译
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-w -s" main.go

#对main二进制文件进行upx压缩后,卸载upx压缩壳程序
RUN upx -9 /go/myProject/main && apk del upx


# 使用alpine这个轻量级镜像为基础镜像--运行阶段
FROM alpine AS runner
# 全局工作目录
WORKDIR /go/myProject
# 复制编译阶段编译出来的运行文件到目标目录
COPY --from=builder /go/myProject/main .
# 将时区设置为东八区
RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \
    && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
    && apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo Asia/Shanghai > /etc/timezone \
    && apk del tzdata

# 需暴露的端口
EXPOSE 8080
# docker run命令触发的真实命令(相当于直接运行编译后的可运行文件)
ENTRYPOINT ["./main"]
  • 编译
docker build -t go/web:0.1 .
  • 镜像构建log
Sending build context to Docker daemon  5.632kB
Step 1/13 : FROM golang:alpine AS builder
 ---> d8bf44a3f6b4
Step 2/13 : MAINTAINER korykim
 ---> Running in 493bc8444c0a
Removing intermediate container 493bc8444c0a
 ---> ccb350a9243f
Step 3/13 : WORKDIR /go/myProject
 ---> Running in 928af1816920
Removing intermediate container 928af1816920
 ---> e6c7a88675f6
Step 4/13 : COPY . /go/myProject
 ---> 8b6782a41456
Step 5/13 : ENV GOPROXY https://goproxy.cn,direct
 ---> Running in eca25e073f24
Removing intermediate container eca25e073f24
 ---> 3f7f62cdfdde
Step 6/13 : RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories     && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories     && apk add --no-cache upx
 ---> Running in f3b1c719e49a
fetch https://mirrors.aliyun.com/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.aliyun.com/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/4) Installing libgcc (6.4.0-r9)
(2/4) Installing libstdc++ (6.4.0-r9)
(3/4) Installing ucl (1.03-r1)
(4/4) Installing upx (3.94-r0)
Executing busybox-1.34.1-r3.trigger
OK: 9 MiB in 19 packages
Removing intermediate container f3b1c719e49a
 ---> b4c5c85c17d4
Step 7/13 : RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-w -s" main.go && upx -9 /go/myProject/main && apk del upx
 ---> Running in 0045bcf8f6b8
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   4280320 ->   1738612   40.62%   linux/amd64   main

Packed 1 file.
WARNING: Ignoring https://mirrors.aliyun.com/alpine/v3.8/main/: No such file or directory
WARNING: Ignoring https://mirrors.aliyun.com/alpine/v3.8/community/: No such file or directory
(1/4) Purging upx (3.94-r0)
(2/4) Purging libstdc++ (6.4.0-r9)
(3/4) Purging libgcc (6.4.0-r9)
(4/4) Purging ucl (1.03-r1)
Executing busybox-1.34.1-r3.trigger
OK: 6 MiB in 15 packages
Removing intermediate container 0045bcf8f6b8
 ---> 4e62746b89ab
Step 8/13 : FROM alpine AS runner
 ---> c059bfaa849c
Step 9/13 : WORKDIR /go/myProject
 ---> Running in e4085b8ac8c7
Removing intermediate container e4085b8ac8c7
 ---> eecc8098e168
Step 10/13 : COPY --from=builder /go/myProject/main .
 ---> ef6dcfc80ea4
Step 11/13 : RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories     && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories     && apk add --no-cache tzdata     && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime     && echo Asia/Shanghai > /etc/timezone     && apk del tzdata
 ---> Running in faa8903f9281
fetch https://mirrors.aliyun.com/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.aliyun.com/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tzdata (2020a-r0)
Executing busybox-1.34.1-r3.trigger
OK: 9 MiB in 15 packages
WARNING: Ignoring https://mirrors.aliyun.com/alpine/v3.8/main/: No such file or directory
WARNING: Ignoring https://mirrors.aliyun.com/alpine/v3.8/community/: No such file or directory
(1/1) Purging tzdata (2020a-r0)
Executing busybox-1.34.1-r3.trigger
OK: 6 MiB in 14 packages
Removing intermediate container faa8903f9281
 ---> 15783988de8c
Step 12/13 : EXPOSE 8080
 ---> Running in 9efc520600c7
Removing intermediate container 9efc520600c7
 ---> 7167bf8453d3
Step 13/13 : ENTRYPOINT ["./main"]
 ---> Running in 2bbb9addf564
Removing intermediate container 2bbb9addf564
 ---> 215fdafdf48d
Successfully built 215fdafdf48d
Successfully tagged go/web:0.1
 
  • 最终docker镜像大小为 7.35MB

    docker image size

  • 运行

docker run --name go-web -it -d -p 8080:8080 go/web:0.1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容