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"]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM