在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
两种方式创建Dockerfile : 一、手动创建编写Dockerfile 1. Dockerfile一些额外注意点 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Shanghai
或者scratch,最小 设置镜像时区 ENV TZ Asia/Shanghai
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.首先安装 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中的默认用户 建议在Dockerfile中创建用户并使用该用户启动 创建一个 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"]
|
请发表评论