编写 Go 项目的 Dockerfile 文件及生成 Docker 镜像

在实际项目开发中,我们通常会将应用程序容器化,以便在不同环境下统一部署、运行和测试。对于 Go 项目,Docker 提供了简洁而高效的容器化解决方案。本篇文章将详细介绍如何为 Go 项目编写 Dockerfile 文件,并生成 Docker 镜像。

1. Go 项目的准备

假设你已经有一个 Go 项目,并且这个项目可以正常运行。为了示范,我们假设你的 Go 项目结构如下:

go 复制代码
my-go-app/
├── main.go
├── go.mod
└── go.sum

main.go 是你的 Go 项目的入口文件,go.mod 是 Go 的模块管理文件,go.sum 用于记录模块的校验信息。 2. 在项目根目录下面创建 Dockfile 文件 3. 编辑Dockfile文件

ini 复制代码
FROM golang:1.19

ENV GO111MODULE=on \
TZ=Asia/Shanghai \
CGO_ENABLE=0 \
GOOS=linux \
GOARCH=amd64 \
GOPROXY="https://goproxy.cn,direct"

WORKDIR /APP

ADD . /APP

RUN go build -o main ./main.go

EXPOSE 9999

CMD ["/APP/main"]

FROM : 使用到的golang的镜像版本,建议和项目中使用的版本一致

ENV:golang使用到的环境变量,为了解决下载依赖慢或者失败的问题

WORKDIR:是将项目的放到容器中的位置

ADD:将项目中的所有文件放入容器的位置下

RUN:编译项目生成二进制文件

EXPOSE:运行的端口

CMD 执行项目的命令

  1. 将项目上传到服务器上

  2. 生成docker镜像

    docker build . -t 镜像名

  3. 启动容器

yaml 复制代码
docker run -d -p 8888:8888 镜像名
# 别忘了服务器的安全组

解释

  • docker run -d:以守护进程模式运行容器。
  • -p 8080:8080:将容器的 8080 端口映射到宿主机的 8080 端口,使得你可以通过浏览器访问应用。
  • --name my-go-app-container:为容器指定一个名字 my-go-app-container
  • my-go-app:运行时使用的镜像名称。

运行后,你可以通过访问 http://localhost:8080 来测试你的应用。如果一切顺利,你将看到 Go 应用的输出。

6. 其他优化和注意事项

  • 多阶段构建:通过多阶段构建,可以将构建工具和运行环境分离,减少最终镜像的体积。
  • 镜像大小:使用 Alpine 镜像作为基础镜像,可以大大减小镜像的体积。
  • 缓存:通过合理利用 Docker 缓存机制,可以加速镜像的构建过程,尤其是在依赖没有变化的情况下。

总结

本文介绍了如何为 Go 项目编写 Dockerfile 文件,并通过 Docker 构建镜像和运行容器。通过容器化技术,我们能够更轻松地管理和部署 Go 应用程序。通过 Dockerfile 的多阶段构建方式,我们可以在保证镜像体积小的同时,确保应用程序的正常运行。这种方式在开发和生产环境中都具有很大的优势。

希望这篇文章能帮助你快速掌握使用 Docker 部署 Go 项目的技巧!

相关推荐
weixin_431600448 分钟前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js
qq_225891746622 分钟前
基于Flask的城市地铁客流量数据预测系统设计与实现
后端·python·flask
IT_陈寒25 分钟前
搞不定JavaScript的数组去重?你可能漏了这两个坑
前端·人工智能·后端
城管不管39 分钟前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
AINative软件工程1 小时前
AI Agent 证据仲裁工程实践:别让检索结果按自信程度撒谎
人工智能·后端·ai编程
卷无止境1 小时前
FastAPI 权限管理实战:从 ACL 到 RBAC 的那些门道
后端·python·fastapi
fthux9 小时前
装闭 RenoPit 源码解析(09):AnalysisEngine装修闭坑分析主流程
人工智能·ai·开源·github·open source·renopit
GreenTea10 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年10 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅10 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试