Docker构建Go工程镜像

2021/06/23

Tags: Docker

摘要:Docker构建Go工程镜像。


工程

工程是一个比较简单的Http server的demo,现在将这个工程构建为docker镜像。

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

func Init() {
    log.Println("start server")
    http.HandleFunc("/hello_world", HelloWorld)
    http.Handle("/test_handle", &TestHandleStruct{content: "test handle"})
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Println("start server on 8080")
    }
    log.Fatal("start server failed.")
}

func main() {
    // 启动HTTP服务
    server.Init()
}

构建

需要在工程根目录下新建一个Dockerfile

内容如下:

# 拉取Go语言的版本
FROM golang:1.16

# 在容器内设置工作目录
WORKDIR /app

# 把文件复制到当前工作目录
COPY . .

FROM alpine:latest as prod

# 设置GOPROXY的环境变量
ENV GOPROXY="https://goproxy.cn"

# 编译项目
#RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64  go build -o ./bin/go_http_server_demo ./src/main/main.go

ADD ./bin/go_http_server_demo ./

# 暴露端口
EXPOSE 8080

# 可执行文件
CMD ["./go_http_server_demo"]

然后到根目录下编译项目,注意编译时要根据当前机器的类型设置环境变量:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64  go build -o ./bin/go_http_server_demo ./src/main/main.go

bin目录下就会多个一个 go_http_server_demo 文件。

⇒  docker build -t go_http_server_demo .
[+] Building 5.6s (7/7) FINISHED                                                                                                                                                                                                                                                                                        
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                               0.0s
 => => transferring dockerfile: 503B                                                                                                                                                                                                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                                                                                                                                                                                   5.4s
 => [internal] load build context                                                                                                                                                                                                                                                                                  0.0s
 => => transferring context: 70B                                                                                                                                                                                                                                                                                   0.0s
 => CACHED [prod 1/2] FROM docker.io/library/alpine:latest@sha256:234cb88d3020898631af0ccbbcca9a66ae7306ecd30c9720690858c1b007d2a0                                                                                                                                                                                 0.0s
 => [prod 2/2] ADD ./bin/go_http_server_demo ./                                                                                                                                                                                                                                                                    0.0s
 => exporting to image                                                                                                                                                                                                                                                                                             0.0s
 => => exporting layers                                                                                                                                                                                                                                                                                            0.0s
 => => writing image sha256:ee46f381509fe33f160de563c185b368dcd200adddcb9b663a6656f75b767621                                                                                                                                                                                                                       0.0s
 => => naming to docker.io/library/go_http_server_demo                                                                                                                                                                                                                                                             0.0s

没有报错说明镜像构建完成。

⇒  docker images                        
REPOSITORY                    TAG       IMAGE ID       CREATED          SIZE
go_http_server_demo           latest    ee46f381509f   47 minutes ago   11.7MB

启动

docker run --name go_http_server_demo -p 8080:8080 -d go_http_server_demo
docker ps # 查看启动情况
⇒  docker exec -it 105fdcefe795 sh
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 ./go_http_server_demo
   12 root      0:00 sh
   19 root      0:00 ps
/ # 

可以登录到容器中查看容器的运行情况。

curl -X GET "http://127.0.0.1:8080/hello_world"

最后可以在本机访问接口测试容器是否运行正常。