使用 Dockerfile 在线部署和更新 Golang 项目的最佳实践

1341人浏览 2023-07-26

引言

在现代软件开发中,快速部署和频繁代码更新是非常重要的。Golang 作为一门高效、可靠的编程语言,其开发和部署流程也需要具备相应的灵活性和高效性。本文将介绍如何使用 Dockerfile 来在线部署 Golang 项目,并实现便捷的代码更新和管理。

步骤

1. 准备 Dockerfile

首先,创建一个名为 Dockerfile 的文件,并在其中定义容器的构建和运行环境。以下是一个示例的 Dockerfile:

# 使用基础的 Golang 镜像作为构建环境
FROM golang:1.19
LABEL authors="lk"

ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn

# 设置镜像源为阿里源
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list \
    && sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list


# 安装 git 和 shell
RUN apt-get update \
    && apt-get install -y git \
    && rm -rf /var/lib/apt/lists/*

# 项目的工作路径
WORKDIR /goproject/wshop_serve

# 复制 go.mod 和 go.sum 文件并下载依赖
COPY go.mod go.sum ./
RUN go mod download
RUN go mod tidy

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

# 允许使用 shell 命令
SHELL ["/bin/bash", "-c"]
#暴露端口
EXPOSE 6688

在这个示例中,我们使用了 Golang 官方镜像作为基础镜像,并将项目文件复制到容器中。然后,我们通过 go mod download 下载项目依赖,并使用 go build 构建项目。最后,我们设置了容器启动时要执行的默认命令。

并且设置了安装git可以在容器中方便进行代码更新。

该 Dockerfile 文件主要用于构建一个基于 Golang 环境的容器,并安装了 Git 和 Shell,设置了镜像源和工作路径,复制了项目文件,并进行了依赖下载和整理。最后,暴露了容器的端口号 6688。

根据您的项目需求,您可能需要在 Dockerfile 中进行更多的配置和定制化。

2. 构建 Docker 镜像

在拥有 Dockerfile 后,我们可以使用 Docker 命令来构建镜像。进入项目根目录,并执行以下命令:

docker build -t my-golang-app .

这将会根据 Dockerfile 中的定义构建一个名为 my-golang-app 的镜像。可以根据实际情况修改镜像名称。

3. 运行容器

在构建完成镜像后,我们可以使用以下命令来运行容器:

docker run -d -it -v /goproject/wshop_serve:/goproject/wshop_serve -v /etc/localtime:/etc/localtime -p 6688:6688 --network 1panel-network --cap-add SYS_TIME --name wshop_serve wshop:1.0.1 /bin/sh

其中 -v 是挂载,挂载就是把服务器宿主机和容器中的保持一致,我们容器里面有一个项目的代码,服务器宿主机上面也有一份代码,应该保持一致,这样的话,我们改变其中一个地方的代码,另外一个地方的代码也会随之改变。

第一个/usr/local/goproject 是我们服务器宿主机放golang代码的地方,后面第二个/usr/local/goproject 是我们容器中放代码的地方,为了方便起见,我把目录都起得一样。后面的/etc/localtime也是一样,这个是为了让我们的容器的时间和服务器宿主机的时间保持一致。

-p是端口映射,我们的阿里云服务器一定要开放8080端口

-d--detach 选项:在 docker run 命令中添加 -d--detach 选项,示例:docker run -d image_name。这将使容器在后台以守护进程方式运行。

-cap-add SYS_TIME 是赋予了容器可以修改时间的权限。

--network 1panel-network意思是设置容器的网络,方便连接mysql等其他容器信息。(用不到可删除)

这样,我们就启动了一个容器,现在的话,我们直接进入到容器内部

4. 运行项目

docker exec -it myapp sh #注意我们此处不能使用bash,因为我们使用的基础镜像是golang

进入到容器中后执行go build 然后直接后台运行执行文件如下:

nohup /usr/local/goproject/ding_server/ding> start.log 2>&1 &
# nohup表示不挂断地运行命令,也就是你即便关掉终端,依然不会终止
# > start.log 将结果输出到start.log中
# 2>&1,2是标准错误,1是标准输出,就是把错误结果打印出来,&1是就是对标准输出的引用
# 最后的&是是把该命令以后台的job的形式运行,可以通过jobs -l命令来查看当前的所有job

备注:新的dockerfile示例

FROM golang:1.19 AS builder

# Set the Current Working Directory inside the container
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn

# 移动到工作目录 /build
WORKDIR /build

# 将代码复制到容器中
COPY . .
RUN go mod download
RUN go mod tidy
RUN go build -o acs .


# 运行二进制文件
FROM alpine:latest

# 安装 Nginx
RUN apk update && apk add nginx

# 移动到 Nginx 默认的静态文件目录
WORKDIR /usr/share/nginx/html

COPY --from=builder /build/web/acs_admin/dist .
COPY --from=builder /build/web/front_nginx.conf /etc/nginx/http.d/default.conf


# 移动到根目录
WORKDIR /run

# 将文件拷贝到当前目录
COPY --from=builder /build/acs ./acs
COPY --from=builder /build/.env ./.env

# 声明需要暴露的端口 实际需要根据配置文件修改
# http服务端口
EXPOSE 9528
# gRPC 服务端口
EXPOSE 9529
# 后台管理端口
EXPOSE 80

# 执行权限
RUN chmod -R 755 ./acs

# 需要启动的命令
ENTRYPOINT ["sh", "-c", "nginx -g '' && ./acs"]


启动容器命令: 启动前先创建挂载文件

docker run -d -it -v ./.env:/run/.env -v ./var:/run/var   -p 19528:9528 -p 19529:9529 --name acs acs:1.2 /bin/sh

 

推荐文章

Docker的基本常用命令大全
2021-04-07
Dockerfile配置指南:常用配置及示例
2023-07-26
搜索文章