Golang应用通过Dockerfile构建Docker镜像
构建镜像
构建一个go应用镜像,当前目录加载项目,编译生成二进制文件
1
2
3
4
5
6
7
8
|
FROM golang:1.14-alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main .
RUN adduser -S -D -H -h /app appuser
USER appuser
CMD ["/app/main"]
|
多阶段构建镜像
第一阶段使用golang:alpine
镜像编译项目生成二进制文件
第二阶段使用scratch
镜像加载二进制文件打包成镜像
golang:alpine
是Go专门为容器设计的小型Linux发行版,基于 busybox 和 musl 构建的
scratch
镜像是Docker项目预定义的最小的镜像,使用scratch
镜像可以节省大量空间,减小镜像大小
1
2
3
4
5
6
7
8
9
10
11
12
13
|
FROM golang:alpine AS build
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
###
FROM scratch as final
RUN adduser -S -D -H -h /app appuser
USER appuser
COPY --from=build /app/myapp .
ENTRYPOINT ["/myapp"]
|
使用编译时参数来指示 go 编译器将运行时库静态链接到二进制文件本身
最终的 Docker 映像只会包含这一个可执行文件,而无需使用容器操作系统
centurylink/ca-certs
是基于 scratch
镜像构建,并为所有标准证书颁发机构添加了根证书。
1
2
3
4
5
6
7
8
9
10
|
FROM golang:alpine as builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o myapp .
FROM centurylink/ca-certs
COPY --from=builder /app/myapp /app/
WORKDIR /app
CMD ["./myapp"]
|
一个golang工作环境镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# base image
FROM golang:1.12.1
# maintainer
MAINTAINER Phil Wang <814004090@qq.com>
RUN mkdir /develop
RUN mkdir /develop/bin
RUN mkdir /develop/src
EXPOSE 8080
ENV GOPATH /develop
ENV PATH /develop/bin:/usr/local/bin:$PATH
ENV GO111MODULE on
VOLUME /develop/src
WORKDIR /develop
CMD ["sleep","8640000"]
|
1
2
3
4
5
|
# 运行一个golang12镜像的容器,并指定工作目录$HOME/data/golang/testmod
docker run --name golang12 -p 8080:8080 -v $HOME/data/golang/testmod:/develop/src -d golang:1.12.1
# 进入golang12环境终端,进入后可以操作(build等)
docker exec -it golang12 /bin/bash
|
参考