Go项目打包创建Docker镜像并部署

使用Dockerfile文件构建镜像

在Go项目路径下,创建一个新的Dockerfile文件,即可根据Dockerfile中的指令来构建对应的docker镜像。
本文中,我的项目结构如下:

.
├── Template
└── webForm.go

编写Dockerfile

# 导入基础镜像golang:alpine
FROM golang:alpine AS builder

# 设置环境变量
ENV GO111MODULE=auto \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct"
	
# 创建并移动到工作目录(可自定义路径)
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件,文件名为 WebApp
RUN go build -o WebApp .

# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist

# 将二进制文件从 /build 目录复制到这里
RUN cp /build/WebApp .

# 将项目用到的静态文件拷贝到镜像(如果没有可忽略该步骤)
COPY ./Template /dist/Template

# 声明服务端口
EXPOSE 9090

# 启动容器时运行的命令
CMD ["./WebApp"]

在终端移动到项目路径下,执行指令构建docker镜像

# goweb_app:v0为镜像名,可自行更改
docker build . -t goweb_app:v0

终端输出如下日志,即代表构建成功

Successfully built 6adbd92bed46
Successfully tagged goweb_app:v0

输入如下指令,启动镜像(端口号和镜像名根据自己的设置进行更改)

docker run -p 9090:9090 goweb_app:v0

可打开新终端,输入如下指令查看镜像

docker images

可以看到构建的镜像很大(我的高达300M),因为镜像包含了golang:alpine基础镜像。下面可以采用分阶段构建的方式优化。

分阶段构建docker镜像

上述构建方法中,会把基础镜像golang:alpine同时封装进去,而go应用在编译好以后可以不依赖编译器而运行。所以可以在项目编译以后构建一个不包含编译器的小镜像,然后从编译器中将编译好的二进制文件取出来进行封装,这样就可以构建不包含编译器的小镜像文件。

# 导入基础镜像golang:alpine
FROM golang:alpine AS builder

# 设置环境变量
ENV GO111MODULE=auto \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct"
	
# 创建并移动到工作目录(可自定义路径)
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 将代码编译成二进制可执行文件,文件名为 WebApp
RUN go build -o WebApp .

# 利用scratch创建一个小镜像
FROM scratch

# 从builder镜像中把/WebApp 拷贝到当前目录
COPY --from=builder /build/WebApp /

# 将项目用到的静态文件拷贝到镜像(如果没有可忽略该步骤)
COPY ./Template /Template

# 声明服务端口
EXPOSE 9090

# 启动容器时运行的命令
CMD ["/WebApp"]

同样的,在终端移动到项目路径下,执行指令构建docker镜像

# goweb_app:v0为镜像名,可自行更改
docker build . -t goweb_app:v0

终端输出如下日志,即代表构建成功

Successfully built 6adbd92bed46
Successfully tagged goweb_app:v0

输入如下指令,启动镜像(端口号和镜像名根据自己的设置进行更改)

docker run -p 9090:9090 goweb_app:v0

借助scratch创建的小镜像不包含编译器,因此很小(我的8M)。

注意:采用scratch方式构建的镜像不能使用sh指令

采用软件自动编写Dockerfile

借助goct工具可以实现Dockerfile的快速生成

首先安装一下工具

GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest

移动到项目所在路径,直接执行指令,快速构建镜像

# webForm.go改为你自己的项目文件
goctl docker -go webForm.go

也可以用指定方式镜像分阶段构建镜像(此处以 scratch为例)

goctl docker -base scratch -go webForm.go

生产的Dockerfile文件如下

FROM golang:alpine AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk update --no-cache && apk add --no-cache tzdata

WORKDIR /build

ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o /app/webForm webForm.go


FROM scratch

COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/Shanghai

COPY --from=builder /app/webForm /

COPY ./Template /Template

CMD ["/webForm"]

经试验,采用该方式可以生成一个完整的Dockerfile框架,但是不一定可以直接使用。我构建好以后,由于没有自动导入静态文件Template导致不可用,自行在Dockerfile中修改添加了静态文件即可。

采用该方式构建,文件中务必包含go.mod和go.sun文件

参考资料

链接: https://www.cnblogs.com/kevinwan/p/16033634.html
链接: https://juejin.cn/post/6899041488806936583

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Docker镜像部署项目的方法。 当使用Docker镜像部署项目时,首先需要创建一个Dockerfile。Dockerfile是一个文本文件,其中包含了Docker镜像的构建指令。你可以在Dockerfile中指定基础镜像、添加依赖、复制文件、运行命令等操作。通过编写这些指令,你可以自定义镜像来满足你的项目需求。 一旦Dockerfile编写完,你可以使用Docker命令来构建镜像。通过运行"docker build"命令并指定Dockerfile的路径,Docker会根据该文件中的指令构建一个新的镜像。你可以为这个镜像指定一个名字和标签,以便在将来使用。 构建完后,你可以使用"docker run"命令来创建一个容器并在其中运行你的项目。在这个命令中,你可以指定镜像的名称和标签,以及其他的容器配置选项,例如端口映射、环境变量等。Docker会根据这些配置来创建并启动容器,使你的项目容器中运行起来。 通过Docker镜像部署项目,你可以将项目的运行环境与依赖项打包在一起,并确保项目在不同的环境中都能够一致地运行。这样可以简化部署过程,提高应用的可移植性和可扩展性。此外,Docker还提供了一些其他的功能,例如容器编排、镜像版本控制等,可以帮助你更好地管理和维护项目。 总结来说,使用Docker镜像部署项目需要编写Dockerfile来定义镜像的构建过程,然后使用docker命令来构建镜像创建容器运行项目。这种方式可以提供一种可移植、可扩展的部署解决方案。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [详解如何使用Docker部署一个web项目打包镜像文件](https://download.csdn.net/download/weixin_38499503/14891966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [基于Docker镜像部署go项目的方法步骤](https://download.csdn.net/download/weixin_38613330/12898821)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值