摘要: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 # 查看启动情况
- –name go_http_server_demo 指定container的名称
- -p 8080:8080 将本地的8080端口映射到容器的8080端口
- -d 指定容器后台运行,执行后当前终端可以退出
- go_http_server_demo 指定镜像名称
⇒ 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"
最后可以在本机访问接口测试容器是否运行正常。