以如下这个简单的项目为例
创建Dockerfile文件
#指定构建镜像的基础镜像
FROM golang:1.18-alpine
#开发者
MAINTAINER who
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
#设置工作目录,后面的RUN,COPY等都基于在这个目录下工作
WORKDIR /goApp
# 复制项目文件到工作目录
COPY . .
# 编译应用程序成二进制文件app
RUN go build -o app
#容器暴露的端口
EXPOSE 8080
#启动容器时运行的命令
CMD ["./app"]
然后通过以下命令构建镜像
docker build -t goWeb:1.0 .
由于go语言是编译型的语言,只需要将项目编译成一个二进制文件即可运行,不需要还基于golang的环境
所以可以采用分阶段构建镜像,减小打包后的文件大小
#指定构建镜像的基础镜像
FROM golang:1.18-alpine AS builder
#开发者
MAINTAINER who
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
#设置工作目录,后面的RUN,COPY等都基于在这个目录下工作
WORKDIR /goApp
# 复制项目文件到工作目录
COPY . .
# 编译应用程序成二进制文件app
RUN go build -o app
###################
# 接下来创建一个小镜像
###################
FROM scratch
WORKDIR /goApp
# 从第一阶段复制二进制文件到当前阶段
COPY --from=builder /goApp/app .
#容器暴露的端口
EXPOSE 8080
#启动容器时运行的命令
CMD ["./app"]
然后通过以下命令构建镜像
docker build -t goWeb:1.1 .
结果显示
如果我这个项目构建的容器需要关联其他如mysql容器该如何做?
需要将项目中关于mysql的主机(127.0.0.1)名改为容器名字。
构建镜像后,通过–link的方式与需要关联的容器关联起来,比如
docker run --link=mysql1:mysql1 -p 8080:8080 goweb:1.1
在windows上构建的镜像如何发布到服务器上运行?
可以将镜像发布到云仓库,然后在服务器上又将仓库中的镜像拉取下来运行
参考文献:
1 https://www.bilibili.com/video/BV1tX4y1F7Xj/?spm_id_from=333.337.search-card.all.click&vd_source=b65afe73c2248cf649cdaa19490e01ed
2 https://www.liwenzhou.com/posts/Go/deploy-in-docker/