【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成
本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等
文章目录
- 前言
- Dockerfile介绍
- goctl工具生成Dockerfile
- 安装工具
- 命令行输入
- Dockerfile
- 构造镜像
- 查看镜像:
- 启动镜像:
前言
参考文档:
- docker日常使用,编写dockerfile等
- dockerfile编写
开发完项目之后,可以通过dockerfile将项目打包成镜像
Dockerfile介绍
Dockerfile 是用于构建 Docker 镜像的文本文件,其中包含一系列指令(命令)。这些指令按照顺序执行,用于定义镜像的构建过程。下面是常用的 Dockerfile 命令及其详细解释:
- FROM:指定基础镜像,用于构建当前镜像的基础。例如:
FROM ubuntu:latest
。 - LABEL:为镜像添加元数据,可以包含任意键值对。例如:
LABEL maintainer="yourname@example.com"
。 - RUN:在镜像中执行命令,并创建新的镜像层。例如:
RUN apt-get update && apt-get install -y curl
。 - CMD:指定容器启动时要执行的命令,该命令只能有一个。例如:
CMD ["nginx", "-g", "daemon off;"]
。 - EXPOSE:声明容器运行时监听的端口。例如:
EXPOSE 8080
。 - ENV:设置环境变量。例如:
ENV MYSQL_VERSION 5.7
。 - ADD:将文件、目录或远程 URL 的内容复制到镜像中。例如:
ADD app.jar /app/
。 - COPY:将文件或目录复制到镜像中。例如:
COPY ./src /app/src
。 - WORKDIR:设置工作目录,后续命令将在该目录下执行。例如:
WORKDIR /app
。 - VOLUME:声明持久化目录,用于在容器和主机之间共享数据。例如:
VOLUME /data
- ENTRYPOINT:指定容器启动时要执行的命令,与 CMD 不同的是,ENTRYPOINT 不会被Dockerfile 中的指令覆盖。例如:
ENTRYPOINT ["java", "-jar", "app.jar"]
。 - USER:设置运行后续命令的用户名或 UID。例如:
USER myuser
。 - ARG:定义构建参数,可以在构建镜像时通过 --build-arg 传递。例如:
ARG VERSION=latest
。 - ONBUILD:指定触发器命令,在当前镜像被继承时执行。例如:
ONBUILD ADD . /app
。
下面是一个简单的示例,演示了如何编写一个用于构建基本 Go 应用程序的 Dockerfile。
# 使用官方的 Golang 镜像作为基础镜像
FROM golang:1.16# 在容器内创建一个目录来存放我们的应用代码
RUN mkdir /app# 将工作目录切换到 /app
WORKDIR /app# 将当前目录下的所有文件拷贝到 /app 目录
COPY . .# 编译 Go 应用程序
RUN go build -o myapp .# 暴露 8080 端口
EXPOSE 8080# 运行应用程序
CMD ["./myapp"]
当然还有更简便的方式,使用goctl工具生成Dockerfile,解放了生成力~
goctl工具生成Dockerfile
安装工具
go install github.com/zeromicro/go-zero/tools/goctl@latest
命令行输入
(base) yangmiao@ym-mac gin-blog % goctl docker --help
Generate DockerfileUsage:goctl docker [flags]Flags:--base string The base image to build the docker image, default scratch (default "scratch")--branch string The branch of the remote repo, it does work with --remote--exe string The executable name in the built image--go string The file that contains main function-h, --help help for docker--home string The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority--port int The port to expose, default none--remote string The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priorityThe git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure--tz string The timezone of the container (default "Asia/Shanghai")--version string The goctl builder golang image version
在执行该命令后,Goctl 会自动生成一个名为 Dockerfile 的文件,包含适当的环境配置和基础镜像信息。
goctl docker --go main.go
生成的Dockerfile文件如下所示
Dockerfile
多阶段构建
- 第一个 FROM 开始的部分是构建一个 builder 镜像,目的是在其中编译出可执行文件 main
- 第二个 From 开始的部分是从第一个镜像里 copy 出来可执行文件 main,并且用了基础镜像 scratch ,以保障最终镜像尽可能小
FROM golang:alpine AS builderLABEL stage=gobuilderENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesRUN apk update --no-cache && apk add --no-cache tzdataWORKDIR /buildADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o /app/main main.goFROM scratchCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/ShanghaiWORKDIR /app
COPY --from=builder /app/main /app/mainCMD ["./main"]
- 默认禁用了 cgo
- 启用了 GOPROXY 加速 go mod download
- 去掉了调试信息 -ldflags=“-s -w” 以减小镜像尺寸
- 安装了 ca-certificates,这样使用 TLS证书就没问题了
- tzdata 在 builder 镜像安装,并在最终镜像只拷贝了需要的时区
- 自动设置了本地时区
构造镜像
至于docker如何使用,可以参考Docker-常用命令介绍,看这一篇就够了
在项目根目录下,执行docker build
,用于生成镜像,生成镜像后就可以查看和启动了~
docker build -t go-blog:v1 .
(base) yangmiao@ym-mac gin-blog % docker build -t go-blog:v1 .
ERROR: Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?
(base) yangmiao@ym-mac gin-blog % sudo docker build -t go-blog:v1 .
Password:
[+] Building 515.7s (18/18) FINISHED => [internal] load build definition from Dockerfile 0.1s=> => transferring dockerfile: 694B 0.0s=> [internal] load .dockerignore 0.1s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/golang:alpine 308.4s=> [internal] load build context 10.3s=> => transferring context: 215.37MB 10.1s=> [builder 1/9] FROM docker.io/library/golang:alpine@sha256:70afe55365a265f0762257550bc38440e0d6d6b97020d3f8c85328f00200dd8e 156.9s=> => resolve docker.io/library/golang:alpine@sha256:70afe55365a265f0762257550bc38440e0d6d6b97020d3f8c85328f00200dd8e 0.0s=> => sha256:86a63ed24dc22a348b35d99b5ec9dc67ff66563b539875e5c8ab2d870b3991ac 286.31kB / 286.31kB 75.8s=> => sha256:ae48e6158ebb1a353f7d7b0676b0bd55a09a448a440b65135db378ffb0040919 64.09MB / 64.09MB 153.7s=> => sha256:70afe55365a265f0762257550bc38440e0d6d6b97020d3f8c85328f00200dd8e 1.65kB / 1.65kB 0.0s=> => sha256:635bf83d6a1993bf40e3c575d7b522d41950af4f1a5c1c7cd01c81d93b76f4bf 1.16kB / 1.16kB 0.0s=> => sha256:1ddcbcaf7f02eab589ea6e5727ede30fe040922e4674737894898cddeaba40e0 6.34kB / 6.34kB 0.0s=> => sha256:2c03dbb20264f09924f9eab176da44e5421e74a78b09531d3c63448a7baa7c59 3.33MB / 3.33MB 76.8s=> => sha256:edabe92b0de78c4b662f63a4b2884d0821795e38a90c7ec070ccfa98f8aa236c 156B / 156B 151.3s=> => extracting sha256:2c03dbb20264f09924f9eab176da44e5421e74a78b09531d3c63448a7baa7c59 0.8s=> => extracting sha256:86a63ed24dc22a348b35d99b5ec9dc67ff66563b539875e5c8ab2d870b3991ac 0.1s=> => extracting sha256:ae48e6158ebb1a353f7d7b0676b0bd55a09a448a440b65135db378ffb0040919 2.6s=> => extracting sha256:edabe92b0de78c4b662f63a4b2884d0821795e38a90c7ec070ccfa98f8aa236c 0.0s=> [builder 2/9] RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 1.0s=> [builder 3/9] RUN apk update --no-cache && apk add --no-cache tzdata 2.7s=> [builder 4/9] WORKDIR /build 0.0s=> [builder 5/9] ADD go.mod . 0.0s=> [builder 6/9] ADD go.sum . 0.0s=> [builder 7/9] RUN go mod download 14.2s=> [builder 8/9] COPY . . 7.4s=> [builder 9/9] RUN go build -ldflags="-s -w" -o /app/main main.go 24.5s=> [stage-1 1/4] COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt 0.0s=> [stage-1 2/4] COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai 0.0s=> [stage-1 3/4] WORKDIR /app 0.0s=> [stage-1 4/4] COPY --from=builder /app/main /app/main 0.1s=> exporting to image 0.1s=> => exporting layers 0.1s=> => writing image sha256:556e5362b86a63c8d1325549b595d987c8c79ad749524875c9d018c44cbf3ad5 0.0s=> => naming to docker.io/library/go-blog:v1 0.0s
查看镜像:
sudo docker images | grep go-blog
启动镜像:
sudo docker run -it go-blog:v1
相关文章:
【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成
本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等 文章目录 前言Do…...
Python:可以做什么?
简介 Python是一种高级编程语言,因其简单易学、代码可读性强和拥有丰富的标准库而广受欢迎。Python可以用于许多不同领域,主要包括: 数据分析与数据科学:Python有强大的数据处理和分析库,如Pandas、NumPy和SciPy&…...
Lookup Argument简史
1. 引言 主要参考Ingonyama团队2023年4月文章《A Brief History of Lookup Arguments》。 近年来zk-SNARKs的研究热点有: 让ZKP proof更succinct降低Prover time和Verifier time 但,大多数SNARKs仍受限于,易于转换为多项式的算术运算。通…...
【unity3D】Transform组件(如何访问和获取Transform组件)
💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的Transform组件 Transform组件 基础知识介绍三个成员变量常用属性扩展 Transform的相关查找方法静态方法 基础知识 介绍 在Unit…...
单实例应用程序
2023年12月6日,周三凌晨 什么是单实例应用程序 单实例应用程序可以确保在同一时间只有一个应用程序实例在运行。 通常情况下,当用户尝试再次启动一个已经启动过的应用程序时,操作系统会打开一个新的实例。但有些情况下,我们可能…...
Qlik 成为网络犯罪的焦点
研究人员警告说,Cactus 勒索软件组织正在利用 Qlik Sense 数据可视化、探索和监控解决方案中的关键漏洞来获得对企业网络的初始访问权限。 今年八月下旬,Qlik Sense 开发人员 针对影响 Windows 版本平台的两个关键漏洞发布了补丁 。 其中一个漏洞 CVE-…...
1+X Web 前端开发职业技能等级证书模拟题(中级)理论知识
1X Web 前端开发职业技能等级证书模拟题(中级)理论知识 一、单项选择题 在 Bootstrap 中,可以使用 navbar-header 类的情况是() A 为整个页面添加一个标题 B 为导航栏添加一个标题 C 为导航栏 添加头部 D 为整个页面添…...
2023.12.4 关于 Spring Boot 统一异常处理
目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易,通…...
企业网络安全守护者:EventLog Analyzer日志审计系统
在当今数字时代,企业网络不仅仅是业务运营的核心,也成为各种潜在威胁的目标。为了保障企业的网络安全,日志审计系统成为了不可或缺的一环。其中,ManageEngine的EventLog Analyzer作为一款强大而全面的日志管理与审计解决方案&…...
剪映最新版的4.9,主要更新的功能(于2023年12月2日发布)
新增“多轨道音频”功能:用户可以将多个音频轨道叠加在一起,并对每个音频轨道进行单独的编辑。这使得用户可以更灵活地控制视频的音频效果。新增“音频调音”功能:用户可以使用音频调音功能对视频的音频进行调节,包括音量、音调、…...
IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解
第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义,主要作用:所有子标签均需要设置在跟标签内部 1.3 核心配置文件…...
maven-profile
指定profile生效的几种方式 maven中profile的使用详解_maven profile_2021不再有雨的博客-CSDN博客 【Maven】【翻译】3、Profiles文件_maven的profiles文件是什么-CSDN博客 查看当前生效的profile mvn help:active-profiles 比如有些是用activeProfiles在pom中指定的&…...
用python找到音乐数据的位置,并实现音乐下载
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 需求分析: 有什么需求要实现? 这些需求可以用什么技术实现? 找到音乐数据的位置, 分析 不同音乐的链接有何规律?https://lx-sycdn.kuwo.cn/b784688662c82db8…...
MATLAB算法实战应用案例精讲-【图像处理】边缘检测(补充篇)(附MATLAB代码实现)
目录 前言 几个相关概念 知识储备 数字图像处理(Digital Image Processing)...
黑马头条数据管理平台项目总结
今天主要看了该项目的介绍,这个黑马头条数据管理平台项目主要包括登录、用户的权限判断、文章内容列表的筛选和分页、文章的增删查改还有图片和富文本编辑器这几大部分组成,项目配套了素材代码,像资源文件、第三方插件、页面文件夹、工具插件…...
IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)
除此之外,其他常用的光标移动快捷键包括: Shift 滚轮前后滚动:当前文件的横向滚动轴滚动。Shiftenter:快速将鼠标移动到下一行。Ctrl ]:移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键:光标跳转…...
对标Gen-2!Meta发布新模型,进军文生视频赛道
随着扩散模型的飞速发展,诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢,因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…...
zabbix的自动发现机制、代理功能、SNMP监控
一、自动发现(不安全,有时会失效,建议手动添加主机) 1、定义 zabbix主动与服务端联系,将自己的地址和端口发送给服务端,实现自动添加监控主机 客户端是主动的一方 2、缺点 若自定义网段中主机数量太多…...
spring webflux文件上传与下载
1、文件上传: Controller: PostMapping("/import")public void importImage(RequestPart("file") FilePart filePart) {imageService.importImage(filePart);}Service: public void importImage(FilePart filePart) {Fi…...
Android MVVM+coroutine+retrofit+flow+hilt
文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构: 依赖注入层 数据库: Module InstallIn(SingletonComponent::class) class DBModule {Singleto…...
elasticsearch副本和分片
1.文档冲突 当我们使用index API更新文档,可以一次性读取 修改索引副本 rootes-node3:~# curl -XPUT http://192.168.1.136:9200/es-syslog-2023.08.26/_settings -H "Content-Type: application/json" -d { > "settings": { > …...
【Python】zip
Python中的zip()函数可以将多个可迭代对象打包成一个元组序列,然后返回这些元组序列组成的迭代器。zip()函数的语法如下: zip(*iterables)其中,iterables是可迭代对象,可以是多个,也可以是一个。zip()函数将返回一个迭…...
西安安泰——ATA-1220E宽带放大器
ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp),最大输出电流1Ap(>50Hz)。电压增益数控可调,一键保存设置,提供了方便简洁的操作选择,可…...
数据结构和算法专题---4、限流算法与应用
本章我们会对限流算法做个简单介绍,包括常用的限流算法(计数器、漏桶算法、令牌桶案发、滑动窗口)的概述、实现方式、典型场景做个说明。 什么是限流算法 限流是对系统的一种保护措施。即限制流量请求的频率(每秒处理多少个请求…...
亚信安慧AntDB受邀分享核心业务系统全域数据库替换实践
近日,亚信安慧AntDB数据库凭借丰富的核心业务系统升级替换能力和经验,受邀参与IT168组织的第三期“国产软硬件升级替换之路”的直播沙龙。 亚信安慧AntDB数据库相关负责人发表《基于AntDB的CRM全域数据库替换实践》的精彩演讲,通过通信行业率…...
1.uniapp基础
1.uniapp基础 官方文档:uni-app官网 1.1开发工具 (1)工具: HBuilderX HBuilderX-高效极客技巧 1.2 新建项目 (1) 文件》新建项目 (2)选择相应的配置信息,填写项目根路…...
typescript中的策略模式
typescript中的策略模式 当我们需要以整洁、易于维护和易于调试的方式构建应用程序时,使用设计模式是一种非常好的方式。 在本文中,我们的目标是阐明如何将策略模式无缝地集成到我们的应用程序中。如果我们熟悉依赖性注入,可能会发现策略模…...
Hadoop学习笔记(HDP)-Part.16 安装HBase
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...
C语言练习记录(蓝桥杯练习)(小蓝数点)
目录 小蓝数点 第一题程序的输出结果是?: 第二题下面代码的执行结果是什么?: 第三题下面代码的执行结果是什么?: 第四题关于关系操作符说法错误的是?: 第五题对于下面代码段,y的值为? 第六题sum 21 …...
RPG项目01_层级设置
基于“RPG项目01_UI面板Game”, 找到狼人 添加组件,让狼人一定区域自动跟随主角进行攻击 解释:【烘培蓝色】因为如果什么都不做就会被烘培成蓝色对应的功能就是 可修改区域功能 当将区域设置成不可行走状态,则不为蓝色 烘培&…...
2017做哪些网站能致富/教育培训机构前十名
windows server2012和win8安装.netframework3.5失败问题及解决方法参考文章: (1)windows server2012和win8安装.netframework3.5失败问题及解决方法 (2)https://www.cnblogs.com/elves/p/3626003.html 备忘一下。...
90设计包图网/seo研究所
一、前期基础知识储备 首先看几个使用LayoutParams的实例: 1、《Android开发艺术探索》第8章,Java代码中动态设置按钮时 通过LayoutParams参数设置按钮位置x、y参数 及Gravity位置信息,从而动态的添加进一个随手势移动的按钮,类…...
南宁企业免费建站/seo是什么部位
前文回顾:如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1)如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2)如何掌握openGauss数据库核心技术?…...
公司做网站怎么样/网站seo批量查询工具
智慧 毅力 无所不能 正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性... Lua和C交互详细总结 转自:http://cn.cocos2d-x.org/tutorial/show?id1474 一、Lua堆栈 要理解Lua和C交互,首先要理解Lua堆栈。 简单来说࿰…...
wordpress 美术馆/大型网站建设平台
模板介绍 精美PPT模板设计,简约创意个人简历求职竞聘PPT模板。一套岗位晋升幻灯片模板,内含橙色多种配色,精美风格设计,动态播放效果,精美实用。 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖而出。 …...
展览设计制作公司/北京百度搜索排名优化
最常用的Eclipse的快捷键,各个实用,由Java攀登网提供。 虽然现在IDEA非常的好用,但是Eclipse还是有一定的受众用户,包括我现在的公司,领导就是让用Eclipse,因此喜欢Eclipse的朋友可以看下。 后面可以再讲…...