docker-compose自动部署go项目全流程,本地到镜像仓库到服务器,踩坑笔记

news/2025/1/14 23:08:49/文章来源:https://www.cnblogs.com/ccccq/p/18671883

声明:个人所学记录,有可以改进的地方希望不吝指教

Dockerfile

# 使用golang官方镜像作为构建环境
FROM golang:1.23-alpine AS builder# 设置工作目录
WORKDIR /app# 设置环境变量镜像变量
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct# 复制go.mod 和 go.sum文件到工作目录
# Docker 使用层(Layer)的概念来构建镜像。每个指令(比如 COPY、RUN)都会创建一个新层。当某一层的内容发生变化时,这一层以及所有后续层都需要重新构建。
COPY go.mod .
COPY go.sum .# 下载依赖
RUN go mod tidy# 复制源代码
COPY . .# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build --ldflags "-s -w" -o main .# 使用轻量级的alpine作为运行环境
FROM alpine:latestWORKDIR /app# 设置时区为上海 使用阿里云的镜像源
RUN sed -i 's|https://dl-cdn.alpinelinux.org|https://mirrors.aliyun.com|g' /etc/apk/repositories && \apk update && \apk add --no-cache tzdata && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone && \apk del tzdata# 从builder阶段复制编译好的二进制文件
COPY --from=builder /app/main .# 暴露应用端口(根据你的应用实际端口修改)
EXPOSE 8080CMD ["./main"]

docker-compose.yml

services:webshop:# ${VERSION}是后面自定义的,这里需要带上image: 阿里云仓库链接/命名空间/镜像仓库:${VERSION}build:context: .dockerfile: Dockerfilecontainer_name: webshop
#    host模式不需要指定端口
#    ports:
#      - "${SERVER_PORT}:${SERVER_PORT}"network_mode: hostvolumes:- ./logs:/app/logs- ./uploads:/app/uploads- .env:/app/.envrestart: unless-stopped

docker-compose中踩坑的点:

1、时区问题,从数据库获取datetime时取到的一直是UTC,但数据库的时间已经是对的,希望获取的是2025-01-14T21:00:00.000+8:00而不是2025-01-14T21:00:00.000Z,尝试更改mysql配置和服务器时间,但问题的根源是我在docker-compose中加了

    environment:- TZ=Asia/Shanghai

导致时区错乱。

2、挂载问题,由于.env文件是 . 开头,所以是隐藏状态,使用ls命令无法查看到文件,可以直接cat .env输出文件内容查看是否挂载成功。在容器未运行时候由于挂载未生效,此时使用docker run -it 镜像ID sh 查看想挂载的文件是查看不到的,在这卡了很久一直以为未挂载成功。

3、由于配置错误容器无法启动,无法使用docker exec 查看容器内部情况,可以先在docker-compose.yml中加入
command: /bin/sh -c "sleep 1000"保持程序前台运行后再进入容器查看。

4、使用host模式是因为我使用默认模式时在服务器上无法连接到mysql服务器,不清楚原因但使用host可以连接成功后没有深究。


配置自动化部署,使用Github Actions+阿里云镜像仓库

阿里云部分 Start

首先在阿里云控制台中搜索容器镜像服务
在这里插入图片描述


创建个人版实例
在这里插入图片描述


创建一个命名空间
在这里插入图片描述


创建一个镜像仓库,后续的镜像制品都存在这个仓库中
在这里插入图片描述
推送的镜像都在镜像版本中,基本信息中有自己的仓库链接地址,隐私原因不放图了
在这里插入图片描述


在访问凭证中设置一个固定密码
在这里插入图片描述

阿里云部分 END


Github配置 Start

在这里插入图片描述


将密码等隐私信息存储在github中,不明文写在配置中
在这里插入图片描述
github actions的yml配置
在项目中建个文件夹.github,在这个.github文件夹里面再建一个workflows文件夹,下方的go.yml存在这里面。

name: 自动化部署# 当push到master时自动部署,根据个人需要更改
on:push:branches: ["master"]jobs:build:runs-on: ubuntu-latestoutputs:version: ${{ steps.set_version.outputs.version }}  # 添加输出变量,用于传递给其他 job使用steps:- name: 检出代码uses: actions/checkout@v4- name: 配置 Go 环境uses: actions/setup-go@v4with:go-version: '1.23.3'- name: 设置部署时间戳id: set_version  # 添加 id,version表示输出变量名run: echo "version=$(TZ=Asia/Shanghai date +'%Y%m%d_%H%M%S')" >> $GITHUB_OUTPUT  # $GITHUB_OUTPUT是GitHub Actions提供的一个特殊文件,用于存储步骤的输出变量。- name: Docker 登录阿里云镜像仓库uses: docker/login-action@v2with:# secrets: 获取github中存储的数据username: ${{ secrets.ALIYUN_USERNAME }} password: ${{ secrets.ALIYUN_PASSWORD }}registry: 仓库链接- name: 构建和推送 Docker 镜像run: |# steps: 表示当前 job 中的步骤# set_version: 步骤的 id# outputs: 输出变量(固定)# version: 具体的变量名# 构建并推送镜像到仓库docker build -t 仓库链接/命名空间/镜像仓库:${{ steps.set_version.outputs.version }} .docker push 仓库链接/命名空间/镜像仓库:${{ steps.set_version.outputs.version }}deploy:needs: buildruns-on: ubuntu-lateststeps:- name: 检出代码uses: actions/checkout@v4- name: 复制配置文件到服务器uses: appleboy/scp-action@masterwith:host: ${{ secrets.HOST }}username: ${{ secrets.USERNAME }}password: ${{ secrets.PASSWORD }}source: "docker-compose.yml"target: "/www/wwwroot/webshop/server/"overwrite: true- name: 部署服务uses: appleboy/ssh-action@masterwith:host: ${{ secrets.HOST }}username: ${{ secrets.USERNAME }}password: ${{ secrets.PASSWORD }}script: |# export: 导出到shell环境中,让docker-compose读取到# needs: 表示依赖的其他 job# build: job 的名称# outputs: 输出变量(固定)# version: 具体的变量名export VERSION=${{ needs.build.outputs.version }}# 进入服务器项目目录,根据个人需要更改cd /www/wwwroot/webshop/server/# 登录阿里云镜像仓库docker login 仓库链接 \-u ${{ secrets.ALIYUN_USERNAME }} \-p ${{ secrets.ALIYUN_PASSWORD }}# 拉取新镜像并部署docker-compose pulldocker-compose up -d# 清理旧镜像,只保留最新的两个版本docker images "仓库链接/命名空间/镜像仓库:*" --format "{{.ID}} {{.CreatedAt}}" | \sort -k 2 -r | \awk 'NR>2 {print $1}' | \xargs -r docker rmi

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署d2l环境

编写dockerfile # 使用NVIDIA提供的CUDA基础镜像,包含CUDA 11.8.0和cuDNN 8,基于Ubuntu 22.04 FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 # 设置维护者信息 MAINTAINER watcherprime <woma@126.com># 设置环境变量,包括时区、非交互式前端和PATH变量 ENV TZ=…

【TCP协议】TCP Keepalive 指南

1、什么是 TCP Keepalive?TCP Keepalive 是一种 TCP 协议内置的探测机制,用于检测长时间未活动的连接是否仍然存活。当启用了 Keepalive 后,TCP 会在连接空闲一定时间后,定期向对端发送探测包,如果未收到对端的响应,则会尝试多次探测,最终关闭连接。 用途: 检测并清理死…

《CPython Internals》阅读笔记:p151-p151

《CPython Internals》学习第 9天,p151-p1510 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1.marshal (1)marshaling Marshalling or marshaling(US spelling) is the process of transforming the memory representation of an object into a data form su…

# vm逆向

vm逆向 虚拟机逆向与实现-CSDN博客 对上面博客的总结。 引 vm逆向题,一般是小型虚拟机程序,可以理解为一种模拟器,有start,dispatcher,opcode等结构。常见使用while-switch/if这类循环+选择结构来实现简单的虚拟机模拟,如下:逆向重点:分析入口,搞清输入和opcode的位置理…

【Gossip 协议】Redis 集群中节点之间的通信方式?

# 分布式系统 # Gossip 协议 在分布式系统中,不同的节点进行数据/信息共享是一个基本的需求。 一种比较简单粗暴的方法就是 集中式发散消息,简单来说就是一个主节点同时共享最新信息给其他所有节点,比较适合中心化系统。这种方法的缺陷也很明显,节点多的时候不光同步消息的…

推荐一款超棒的 Minecraft 启动器:Voxelum/x-minecraft-launcher

X Minecraft Launcher (XMCL) 是一个便于你管理多种整合包、模组、资源包、光影包的现代化启动器。它还支持 Minecraft Forge、 Fabric、Quilt、CurseForge 和 Modrinth它具有以下令人心动的特点:多版本兼容性:支持多个 Minecraft 版本,正式版和愚人节版本。自动化资源下载与…

互联网大中小厂实习面经:滴滴、美团、货拉拉、蔚来、信通院等

本文介绍Momenta、蔚来、中国信息通信研究院、昆仑万维、滴滴、易智瑞等企业各类技术岗位的暑期实习、日常实习面试流程与具体问题~本文介绍Momenta、蔚来、中国信息通信研究院、昆仑万维、滴滴、易智瑞等企业各类技术岗位的暑期实习、日常实习面试流程与具体问题。在前一段时间…

2025年1月买的几个好用的「新物件」

前言 去年底比较忙,换工作+搬家什么的,一堆事情凑在一起,很多24年买的东西还没发开箱 只能后面慢慢补上了,现在先把1月份买的一些东西发一下 红米k80手机 本来我是不想买手机的 不过办了新的套餐,营业厅送了购机补贴,不是很多,所以在补贴范围内选择了「看起来」性价比最…

安卓平板使用can-utils检查can通信功能

安装 termux 打开安卓平板 USB 调试模式,并确保电脑安装了 adb。 下载 termux,通过adb install ./termux.exe安装 termux 到安卓平板。 设置 termux 换源 安装好 termux 后打开,进行换源操作。 termux 中输入termux-change-repo。空格切换选中状态,移动方向键切换选中项目,…

最小系统板五要素

最小系统板五要素 电源在进入芯片的时候需要旁路电容将高频杂散干扰旁路掉VBAT:备用电池 VDD:普通电源 VDDA:ADC信号的电源地VSS:普通地 VSSA:ADC的地晶振给单片机提供时钟脉冲,具体的电容值参考晶振手册??OSC: 外部高速晶振 OSC32: 外部低速晶振复位上电复位和按键复位…

nodecanvas插件的黑魔法:一行代码避免拖拽节点的意外脱离

简介 在nodecanvas造轮子的过程,遇到了鼠标拖拽太快,节点经常会脱离控制的情况。但是nodecanvas却不会有这个问题。 一番折腾发现是nodecanvas调用了GUI.DragWindow(),而我觉得这个函数没啥用给删除了的原因。。 GUI.DragWindow()在MouseDown事件触发时,会调用GrabMouseCon…

windows server2016搭建AD域服务器

windows server2016搭建AD域服务器@目录一、背景二、搭建AD域服务器步骤三、生成可供java程序使用的keystore文件四、导出某用户的keytab文件五、主机配置hosts文件六、主机确认是否能ping通本人其他相关文章链接 一、背景 亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍…