news 2026/9/3 2:33:48

如何将go项目部署到docker上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何将go项目部署到docker上

一、上传你的go项目

如:这是我的项目目录

可以直接进行拖拽

二、在虚拟机上创建这样的目录结构

~/GoProJect/pro1/test01 我这样是为了确保导入包的路径正确,确保项目能正常运行。

然后就把common\server\user\vin 这四个文件拖到 test01目录下,还有go.mod和go.sum也放到test01目录下

三、构建Dockerfile文件

注意:也是放在test01目录下,当然也可以放在其他目录,不过这样更方便

# 构建阶段 # 多阶段构建,第一阶段专门用于编译 # 基础镜像:golang:1.21-alpine 包含go编译环境的轻量级 Alpine Linux # 别名:As builder 给这个阶段命令,方便第二阶段引用 FROM golang:1.21-alpine AS builder # 设置工作目录,容器默认的工作目录 WORKDIR /app # 设置Go模块代理(国内加速) ENV GOPROXY=https://goproxy.cn,direct # 复制go.mod和go.sum文件 COPY go.mod go.sum ./ # 下载依赖 RUN go mod download # 复制所有源代码 COPY . . # 编译Go程序 - 修改为你的main.go路径 # CGO_ENABLED=0:禁用CGO,生成纯Go的静态二进制文件 # GOOS=linux:目标操作系统为Linux # GOARCH=amd64:目标CPU架构为x86_64 RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/chat-server ./server/ # 运行阶段 FROM alpine:latest WORKDIR /app # 安装必要的包 # ca-certificates HTTPS证书 tzdata 时区数据 RUN apk --no-cache add ca-certificates tzdata # 设置时区(可选) ENV TZ=Asia/Shanghai # 从构建阶段复制可执行文件 COPY --from=builder /app/chat-server . # 创建必要的目录结构(用于日志等) RUN mkdir -p /app/logs # 声明容器端口 EXPOSE 8080 # 运行程序 CMD ["./chat-server"]

四、构建docker-compose.yml 文件

version: '3.8' services: chat-server: build: . container_name: chat-server restart: unless-stopped ports: - "8080:8080" environment: DB_HOST: mysql DB_PORT: 3306 DB_USER: root DB_PASSWORD: root DB_NAME: chatroom depends_on: mysql: condition: service_healthy networks: - chat-net mysql: image: mysql:8.0 container_name: chat-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_DATABASE: chatroom healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"] interval: 3s timeout: 5s retries: 10 volumes: - mysql_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d ports: - "3307:3306" networks: - chat-net networks: chat-net: driver: bridge volumes: mysql_data:

五、数据库初始化

创建数据库初始化脚本;

# 创建数据库初始化脚本 mkdir -p mysql-init cat > mysql-init/init.sql << 'EOF' CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); EOF

六、修改服务端数据库的连接

func InitDB() error { var err error // 从环境变量读取配置(Docker Compose设置) dbHost := os.Getenv("DB_HOST") dbPort := os.Getenv("DB_PORT") dbUser := os.Getenv("DB_USER") dbPassword := os.Getenv("DB_PASSWORD") dbName := os.Getenv("DB_NAME") // 设置默认值 if dbHost == "" { dbHost = "localhost" } if dbPort == "" { dbPort = "3306" } if dbUser == "" { dbUser = "root" } if dbPassword == "" { dbPassword = "root" } if dbName == "" { dbName = "chatroom" } // 构建DSN dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", dbUser, dbPassword, dbHost, dbPort, dbName) fmt.Printf("正在连接数据库: %s@%s:%s\n", dbUser, dbHost, dbPort) // 重试连接 for i := 0; i < 10; i++ { db, err = sql.Open("mysql", dsn) if err != nil { fmt.Printf("连接失败,重试 %d/10: %v\n", i+1, err) time.Sleep(3 * time.Second) continue } err = db.Ping() if err != nil { fmt.Printf("Ping失败,重试 %d/10: %v\n", i+1, err) db.Close() time.Sleep(3 * time.Second) continue } fmt.Println("数据库连接成功") return nil } return fmt.Errorf("无法连接数据库: %v", err) }

注意:主要是增加了环境变量的配置

当运行时,可以读取到设置的环境变量,如果没有,就按照默认的

七、启动服务

1.构建镜像

docker-compose build --no-cache

2.启动服务:

docker-compose up --build -d

3.检查状态:

docker-compose logs -f chat-server

因该可以看到:数据库连接成功

4.在test01目录下:

go run user/user.go 就可以正常进行登录或注册了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 17:04:20

LangFlow企业版即将发布,支持高可用集群部署

LangFlow企业版即将发布&#xff0c;支持高可用集群部署 在AI应用加速落地的今天&#xff0c;越来越多企业面临一个共同挑战&#xff1a;如何将实验室里的大模型原型&#xff0c;稳定、高效地部署到生产环境中&#xff1f;传统开发模式下&#xff0c;从设计链路到编写代码、调试…

作者头像 李华
网站建设 2026/9/2 12:29:20

LangFlow Docker镜像优化:启动速度提升60%

LangFlow Docker镜像优化&#xff1a;启动速度提升60% 在AI应用开发日益普及的今天&#xff0c;一个看似不起眼的技术细节——容器冷启动时间&#xff0c;正悄然影响着从原型设计到生产部署的每一个环节。对于使用LangChain构建大语言模型&#xff08;LLM&#xff09;工作流的开…

作者头像 李华
网站建设 2026/9/2 20:52:44

【2025最新】基于SpringBoot+Vue的小区疫情购物系统管理系统源码+MyBatis+MySQL

摘要 在新冠疫情常态化防控背景下&#xff0c;社区封闭管理成为阻断病毒传播的重要手段&#xff0c;而居民生活物资的高效配送成为亟待解决的问题。传统线下购物模式在疫情管控期间存在人员聚集风险&#xff0c;且物资调配效率低下&#xff0c;难以满足居民多样化需求。基于此&…

作者头像 李华
网站建设 2026/9/2 23:58:07

基于ESP32的OneNet连接调试:完整指南

ESP32连接OneNet云平台实战全解析&#xff1a;从零开始构建稳定物联网通信链路 你是否曾为“设备连不上云”而彻夜调试&#xff1f; 是否在MQTT报错码前束手无策&#xff0c;只能反复重启模块&#xff1f; 又或者上传的数据始终无法显示在平台上&#xff0c;却不知问题出在哪…

作者头像 李华
网站建设 2026/9/2 20:52:40

LangFlow自动化测试功能助力CI/CD集成

LangFlow自动化测试功能助力CI/CD集成 在构建AI驱动的智能系统时&#xff0c;一个常见的困境是&#xff1a;开发人员花了几小时精心调优了一个问答工作流&#xff0c;结果同事一次微小的提示词修改&#xff0c;就让整个系统的回答变得离谱。更糟的是&#xff0c;这种问题往往要…

作者头像 李华
网站建设 2026/9/2 20:52:38

射频高速信号PCB布局的干扰规避实践

射频与高速信号共存的PCB设计&#xff1a;从理论到实战的干扰规避之道你有没有遇到过这样的情况&#xff1f;电路原理图明明天衣无缝&#xff0c;元器件选型也精挑细选&#xff0c;可一上电测试&#xff0c;Wi-Fi吞吐量忽高忽低&#xff0c;GPS定位飘得离谱&#xff0c;甚至接收…

作者头像 李华