【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

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

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

相关文章

JavaWeb(十)

一、JavaWeb概述 Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 JavaWeb:使用 Java技术进行web互联网开发。 二、JavaWeb 技术栈 2.1、B/S 架构 B/S 架构:Browser/Server,浏览器/服务器…

ELK的日志解决方案

ELK的日志解决方案 ELK是什么 ELK 是一个缩写,代表 Elastic Stack,而不是三个独立的产品名称。Elastic Stack 是一个开源的数据处理和分析平台,用于实时搜索、分析和可视化大规模数据。ELK 是由三个主要的组件构成: Elasticsea…

[MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录:不要在乎别人怎么看你,因为他们根本就没有时间,他们只关心他们自己。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 MySQL数据库 存储引擎 前言MySQL体…

泽攸科技桌面型扫描电子显微镜(SEM)技术解析

台式扫描电子显微镜是一种利用电子束扫描样品表面并检测样品反射或发射的电子信号,从而获得样品表面形貌、结构和成分信息的仪器。它的工作原理是由电子枪发出的电子束经过栅极静电聚焦后成为直径50微米的点光源,然后在加速电压作用下,经两三…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…

【Spring Boot 源码学习】ApplicationListener 详解

Spring Boot 源码学习系列 ApplicationListener 详解 引言往期内容主要内容1. 初识 ApplicationListener2. 加载 ApplicationListener3. 响应应用程序事件 总结 引言 书接前文《初识 SpringApplication》,我们从 Spring Boot 的启动类 SpringApplication 上入手&am…

我对迁移学习的一点理解——领域适应(系列3)

文章目录 1. 领域适应(Domain Adaptation)的基本概念2.领域适应(Domain Adaptation)的目标3.领域适应(Domain Adaptation)的实现方法4.领域适应(Domain Adaptation)的可以解决的问题…

RC522(RFID射频模块)读卡ID的简单应用

文章目录 一、RFID是什么?二、RC522模块三、使用步骤1.硬件1.硬件连接2.引脚定义 2.软件1.初始化配置代码如下(示例):2.引脚配置代码如下(示例):3.模块复位代码如下(示例&#xff09…

芯片量产导入知识

什么是芯片量产 从芯片功能设计到生产制造、测试等环节,每一个环节都至关重要。 对于保障大规模发货后芯片指标表现的一致性,以及产品应用生命周期内的稳定性和可靠性,需要考虑多种因素。以下是一些相关的观点: 可量产性设计&am…

蓝桥杯2021年5月青少组Python程序设计国赛真题

30 个人在一条船上,超载,需要 15 人下船于是人们排成一队,排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15 人为止,问都有哪些编号的人下船了呢? 2】判断101-200之间有多少个素数,并输出所有素数…

零基础一看就会?Python实现性能自动化测试竟然如此简单

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数,统计系统负载能力生成报告 2.Python中的性能自动化…

TCP数据粘包的处理

TCP数据粘包的处理 背锅侠TCP解决方案2.1 发送端2.2 接收端 背锅侠TCP 在前面介绍套接字通信的时候说到了TCP是传输层协议,它是一个面向连接的、安全的、流式传输协议。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量,处理数据的频率可…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中,用户发送请求,然后到缓存中查询数据。如果缓存中不存在数据的话,就会去数据库查询数据。数据库中有的话,就会更新缓存然后返回数据,数据库中也没有的话就会给用户返回一个空。 1.缓…

Cephadm部署使用rgw对象网关(s3cmd和Java)

文章目录 前提重要概念部署rgw使用对象存储(s3cmd)创建radosgw user安装s3cmd配置s3cmds3cmd使用 使用对象存储(Java代码)引入依赖编码测试 参考 前提 RGW的部署基于以下集群,集群信息如下: 重要概念 区域…

网页设计中增强现实的兴起

目录 了解增强现实 增强现实的历史背景 AR 和网页设计的交叉点 AR 在网页设计中的优势 增强参与度和互动性 个性化的用户体验 竞争优势和品牌差异化 AR 在网页设计中的用例 结论 近年来,增强现实已成为一股变革力量,重塑了我们与数字领域互动的方式。它被…

科研绘图配色方案

科研绘图配色方案 在撰写论文的时候,美观,大气,上档次的图表能够很好地给自己的论文加分。但是在绘制图表的时候往往会面临色彩搭配的问题,选择合适的色彩搭配能够有效地展示自己的方法,但是色彩搭配选择不当的话往往会…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

《深入理解计算机系统》学习笔记 - 第四课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入,相加,相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 (二)A 模块基础设施设置/安全加固(200 分&…

golang学习笔记——sync.Pool

文章目录 sync.Pool示例sync.Pool数据结构TCP连接池总结参考资料 sync.Pool示例 代码 sync.Pool对外提供的New、Get和Put方法。 var buffers sync.Pool{New: func() interface{} { return new(bytes.Buffer)}, }func GetBuffer() *bytes.Buffer {return buffers.Get().(*byt…