在现代软件开发中,快速部署和频繁代码更新是非常重要的。Golang 作为一门高效、可靠的编程语言,其开发和部署流程也需要具备相应的灵活性和高效性。本文将介绍如何使用 Dockerfile 来在线部署 Golang 项目,并实现便捷的代码更新和管理。
首先,创建一个名为 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 中进行更多的配置和定制化。
在拥有 Dockerfile 后,我们可以使用 Docker 命令来构建镜像。进入项目根目录,并执行以下命令:
docker build -t my-golang-app .
这将会根据 Dockerfile 中的定义构建一个名为 my-golang-app
的镜像。可以根据实际情况修改镜像名称。
在构建完成镜像后,我们可以使用以下命令来运行容器:
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等其他容器信息。(用不到可删除)
这样,我们就启动了一个容器,现在的话,我们直接进入到容器内部
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