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

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

时间:2025-01-14 23:10:20浏览次数:1  
标签:compose 仓库 secrets version go 镜像 docker

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

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:latest

WORKDIR /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 8080

CMD ["./main"]

docker-compose.yml

services:
  webshop:
    # ${VERSION}是后面自定义的,这里需要带上
    image: 阿里云仓库链接/命名空间/镜像仓库:${VERSION}
    build:
      context: .
      dockerfile: Dockerfile
    container_name: webshop
#    host模式不需要指定端口
#    ports:
#      - "${SERVER_PORT}:${SERVER_PORT}"
    network_mode: host
    volumes:
      - ./logs:/app/logs
      - ./uploads:/app/uploads
      - .env:/app/.env
    restart: 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-latest
    outputs:
      version: ${{ steps.set_version.outputs.version }}  # 添加输出变量,用于传递给其他 job使用
    steps:
      - name: 检出代码
        uses: actions/checkout@v4

      - name: 配置 Go 环境
        uses: actions/setup-go@v4
        with:
          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@v2
        with:
          # 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: build
    runs-on: ubuntu-latest
    steps:
      - name: 检出代码
        uses: actions/checkout@v4

      - name: 复制配置文件到服务器
        uses: appleboy/scp-action@master
        with:
          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@master
        with:
          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 pull
            docker-compose up -d
            # 清理旧镜像,只保留最新的两个版本
            docker images "仓库链接/命名空间/镜像仓库:*" --format "{{.ID}} {{.CreatedAt}}" | \
              sort -k 2 -r | \
              awk 'NR>2 {print $1}' | \
              xargs -r docker rmi

END

标签:compose,仓库,secrets,version,go,镜像,docker
From: https://www.cnblogs.com/ccccq/p/18671883

相关文章

  • 【Gossip 协议】Redis 集群中节点之间的通信方式?
    #分布式系统#Gossip协议在分布式系统中,不同的节点进行数据/信息共享是一个基本的需求。一种比较简单粗暴的方法就是集中式发散消息,简单来说就是一个主节点同时共享最新信息给其他所有节点,比较适合中心化系统。这种方法的缺陷也很明显,节点多的时候不光同步消息的效率低,还太......
  • 和 google 搜索引擎“交个朋友”
    在前前公司,有一个哥们,解决问题的速度贼快,他总能快速的在浏览器中搜索到他想要的答案。虽然我们遇到的相同的问题,但是搜索出来的答案,却总是千差万别,甚至尝试各种描述都得不到他搜索的结果,当时真是百思不得其解。对于搜索不到他那样的答案,到底是哪个环节出现了问题?直到若干年后,......
  • DOMjudge8.2.3配置DOMserver(基于Docker一键配置,全网最详细,看完包会配)
    文章目录前言配置方式1:手动配置nginx+php-fpm配置方式2:Docker一键安装1.部署MariaDB数据库2.部署DOMserver3.获取初始admin密码以及judgehost密码4.修改grub5.测试6.修改配置文件6.0前言(修改配置必看)6.1[configchecker]-MySQLsettings修改常见问题及对应解决......
  • FastGPT及大模型API(Docker)私有化部署指南
    FastGPT及大模型API(Docker)私有化部署指南​​经过优化,在不影响FastGPT功能的情况下,大幅降低了部署的设备配置要求,仅需1c1h即可正常部署使用。官方要求配置:​​优化后的实际占用情况:运行内存仅需370M(测试学习场景下)​​官方推荐部署容器:​pg​......
  • 高性能、零内存分配的Go日志库--Zerolog
    简介Zerolog是一个高性能、零内存分配的Go日志库。它为不需要垃圾回收的延迟敏感型应用程序提供结构化日志记录功能。您可以以完全零分配的方式使用,这样在初始化记录器对象后,堆上不会再分配其他对象,从而防止触发垃圾回收。Zerolog包提供了一个专用于JSON输出的快速而简......
  • 无法联网怎么在docker中安装Ribbitmq
    如果无法连接互联网,无法在Docker中安装RabbitMQ。但是,您可以使用本地镜像或者手动下载RabbitMQ的Docker镜像并进行安装。以下是使用本地镜像的步骤:从可以上网的计算机上拉取RabbitMQ的官方Docker镜像:dockerpullrabbitmq:3-management然后,使用dockersave命令将镜像保存为tar......
  • python+django/flask的大学生心理咨询平台java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • python+django/flask的影视观享系统(影视评论与评分系统)java+nodejs+php-计算机毕业设
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • python+django/flask的OA管理系统java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • 【国际学术会议推荐】IEEE Xplore、EI、CPCI、CNKI、EI Compendex、Scopus、Google sc
    【国际学术会议推荐】IEEEXplore、EI、CPCI、CNKI、EICompendex、Scopus、Googlescholar检索,方向涉及人文地理、城乡规划、遥感、通信、航天、能源、环境【国际学术会议推荐】IEEEXplore、EI、CPCI、CNKI、EICompendex、Scopus、Googlescholar检索,方向涉及人文地理、......