• go项目创建Dockerfile,构建docker镜像


    两种方式创建Dockerfile :

    一、手动创建编写Dockerfile

    1. Dockerfile一些额外注意点
    选择最简单的镜像

    比如alpine,整个镜像5M左右

    设置镜像时区

    RUN apk add --no-cache tzdata
    ENV TZ Asia/Shanghai

    或者scratch,最小

    设置镜像时区

    ENV TZ Asia/Shanghai


    2. 多阶段构建
    第一阶段,负责构建出可执行文件,确保构建过程独立于宿主机
    第二阶段,将第一阶段的输出作为输入,构建出最终的极简镜像


    3.编写Dockerfile

    FROM golang:1.15.0-alpine3.12 as builder
    ENV GO111MODULE=on \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64 \
        GOPROXY=https://goproxy.cn,direct
    # 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
    # 这是我的代码跟目录
    WORKDIR /opt/gat1400-Go/api-server
    COPY . .
    RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .
    
    FROM alpine as final
    
    # 时区设置成当前时区
    RUN apk add --no-cache tzdata
    ENV TZ="Asia/Shanghai"
    # 移动到用于存放生成的二进制文件的 /opt/app 目录
    WORKDIR /opt/app
    # 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
    COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
    # 在容器目录 /opt/app 创建一个目录 为config
    #RUN mkdir config .
    #COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/
    
    # 指定运行时环境变量
    ENV GIN_MODE=release \
        PORT=8090
    
    # 声明服务端口
    EXPOSE 8090
    CMD ["/opt/app/linux_api_server"]

    如果想构建的镜像更小,可以使用如下写法,使用scratch,

    FROM golang:1.15.0-alpine3.12 as builder
    ENV GO111MODULE=on \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64 \
        GOPROXY=https://goproxy.cn,direct
    # 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
    # 这是我的代码跟目录
    WORKDIR /opt/gat1400-Go/api-server
    COPY . .
    RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .
    
    FROM scratch as final
    
    # 时区设置成当前时区
    #RUN apk add --no-cache tzdata
    ENV TZ="Asia/Shanghai"
    # 移动到用于存放生成的二进制文件的 /opt/app 目录
    WORKDIR /opt/app
    # 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
    COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
    # 在容器目录 /opt/app 创建一个目录 为config
    #RUN mkdir config .
    #COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/
    
    # 指定运行时环境变量
    ENV GIN_MODE=release \
        PORT=8090
    
    # 声明服务端口
    EXPOSE 8090
    CMD ["/opt/app/linux_api_server"]

    二、一键生成Dockerfile(使用插件)

    1.首先安装 goctl 工具

    go get -u github.com/tal-tech/go-zero/tools/goctl

    2.在项目根目录下,执行指令,一键生成Dockerfile

     goctl docker -go main.go       

    生成如下Dockerfile:

    FROM golang:alpine AS builder
    
    LABEL stage=gobuilder
    
    ENV CGO_ENABLED 0
    ENV GOOS linux
    ENV GOPROXY https://goproxy.cn,direct
    
    WORKDIR /build/zero
    
    ADD go.mod .
    ADD go.sum .
    RUN go mod download
    COPY . .
    RUN go build -ldflags="-s -w" -o /app/main ./main.go
    
    
    FROM alpine
    
    RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
    ENV TZ Asia/Shanghai
    
    WORKDIR /app
    COPY --from=builder /app/main /app/main
    
    CMD ["./main"]

    3.根据当前项目修改Dockerfile

    注:1.指定golang:alpine版本,防止引用包版本不一致构建中报错

      2.删除apk update --no-cache &&与 ca-certificates,加快构建速度

      3.添加EXPOSE 暴露端口,以便外部与容器通信,例如:EXPOSE 8090

    FROM golang:1.15.0-alpine3.12 AS builder
    
    LABEL stage=gobuilder
    
    ENV CGO_ENABLED 0
    ENV GOOS linux
    ENV GOPROXY https://goproxy.cn,direct
    
    WORKDIR /build/zero
    ADD go.mod .
    ADD go.sum .
    RUN go mod download
    COPY . .
    RUN go build -ldflags="-s -w" -o /app/main ./main.go
    
    
    FROM alpine
    
    #RUN  apk add --no-cache tzdata
    ENV TZ Asia/Shanghai
    
    WORKDIR /app
    COPY --from=builder /app/main /app/main
    
    
    # 声明服务端口
    EXPOSE 8090
    CMD ["./main"]

    如果想构建的镜像更小,可以使用如下写法,使用scratch,

    FROM golang:1.15.0-alpine3.12 AS builder
    
    LABEL stage=gobuilder
    
    ENV CGO_ENABLED 0
    ENV GOOS linux
    ENV GOPROXY https://goproxy.cn,direct
    
    WORKDIR /build/zero
    ADD go.mod .
    ADD go.sum .
    RUN go mod download
    COPY . .
    RUN go build -ldflags="-s -w" -o /app/main ./main.go
    
    
    FROM scratch
    
    #RUN  apk add --no-cache tzdata
    ENV TZ Asia/Shanghai
    
    WORKDIR /app
    COPY --from=builder /app/main /app/main
    
    
    # 声明服务端口
    EXPOSE 8090
    CMD ["./main"]

    三、执行Dockerfile,并生成docker镜像

    在当前目录下,执行

    docker build -t api-server:v10 .

    四、添加启动用户

    为了避免使用container中的默认用户root启动container,(那可是有安全漏洞的)

     建议在Dockerfile中创建用户并使用该用户启动

    创建一个app-runner的用户, -D表示无密码。

    RUN adduser -u 10001 -D app-runner

    此用户的信息是是需要拷到final中,作为应用程序的启动用户

    USER app-runner

    完整Dockerfile如下:

    FROM golang:1.15.0-alpine3.12 as builder
    # 创建一个app-runner的用户, -D表示无密码
    RUN adduser -u 10001 -D app-runner
    ENV GO111MODULE=on \
        CGO_ENABLED=0 \
        GOOS=linux \
        GOARCH=amd64 \
        GOPROXY=https://goproxy.cn,direct
    # 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
    # 这是我的代码跟目录
    WORKDIR /opt/gat1400-Go/api-server
    COPY . .
    RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .
    
    FROM alpine as final
    
    # 时区设置成当前时区
    RUN apk add --no-cache tzdata
    ENV TZ="Asia/Shanghai"
    # 移动到用于存放生成的二进制文件的 /opt/app 目录
    WORKDIR /opt/app
    # 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
    COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
    # 在容器目录 /opt/app 创建一个目录 为config
    #RUN mkdir config .
    #COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/
    
    # 指定运行时环境变量
    ENV GIN_MODE=release \
        PORT=8090
    
    # 声明服务端口
    EXPOSE 8090
    
    # 使用app-runner启动容器
    USER app-runner
    
    CMD ["/opt/app/linux_api_server"]
  • 相关阅读:
    篝火晚会
    SECHS
    emmc4.X boot1 and boot2
    imx6Q Android7.1 Udisk Mount
    imx6Q 4.1.15 Perf support
    imx6Q 4.1.15 Kgtp support
    imx6Q 4.1.15 early console support
    imx6Q USB OTG Host/Device纯软件切换
    iMX6Q DDR Stresstest
    iMX6Q PowerSave调试
  • 原文地址:https://www.cnblogs.com/zhouj850/p/15796935.html
Copyright © 2020-2023  润新知