兩種方式創建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"]