【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.mzph.cn/news/201773.shtml

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

相关文章

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所,所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外,还需要能源管理消耗监测平台,帮助企业实现节能减排的目标。 工厂能源消费量非常庞大,能源比较难以监测与控制。传统能源的管…

【Linux】信号的保存和捕捉

文章目录 一、信号的保存——信号的三个表——block表,pending表,handler表sigset_t信号集操作函数——用户层sigprocmask和sigpending——内核层 二、信号的捕捉重谈进程地址空间(第三次)用户态和内核态sigaction可重入函数volat…

04 硬件知识入门(二极管)

1 二极管的定义 导电性能介于导体与绝缘体之间的材料称为半导体,常见的半导体材料有硅、锗和硒等。利用半导体材料可以制作各种各样的半导体元器件,如二极管、三极管、场效应管和晶闸管等都是由半导体材料制作而成的。 2 二极管的简介 1.半…

已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍,即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

华为OD机试 - 九宫格按键输入 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

26、卷积 - 实际上是一个特征提取器

矩阵乘法的本质是特征的融合,卷积算法的本质是特征的提取。 回想一下之前所有介绍卷积的时候,描述了一种卷积运算的场景,那就是一个窗口在图片上滑动,窗口中的数值是卷积核的参数,也就是权值。 卷积的计算本质是乘累…

吹响AI技术应用的号角

毫无疑问,各企业正围绕各种技术展开一场持续不断的角逐,力争率先取得领先且具创新性的技术进步,AI技术也不例外。疫情期间,全球各地企业的员工纷纷转向居家办公。因此,为轻松实现这一转型并建立起远程办公的新常态&…

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个: onLaunch(options):当小程序初始化完成时,会触发 onLaunch(全局只触发一次)。onShow(options):当小程序启动或从后台进入前台显示时,会触发 on…

【微信小程序开发】学习小程序的模块化开发(自定义组件和分包加载)

前言 模块化开发是一种将复杂的应用程序分解为一系列独立的模块,每个模块负责完成特定的功能的开发方式。模块化开发可以提高代码的可维护性和可复用性,使开发过程更加高效和灵活。 文章目录 前言模块化开发的重要性和优势自定义组件自定义组件的概念和作…

强强联合!航天科技AIRIOT助力航天电工打造智慧工厂

随着工业4.0时代的到来,电线电缆制造行业正在进入全新的数字化时代,企业需要构建新型智能工厂以助力传统产业智能制造升级。通过搭建智慧系统并结合解决方案,实现从底层产线、车间到工厂资产的全面感知与洞察,以及数据的全量采集与…

接上文 IBM ServeRAID M1015阵列卡 支持RAID5

模块到了,由于着急测试没直接拍照,就是一个跟指甲盖大小的模块,直接安装到阵列卡U1接口上,,不知道U1是哪个位置的参考前文,安装到机器上之后的图片如下 启动服务器,进入WebBIOS,选择…

c语言编译优化引发问题

问题描述 同样的代码,不优化编译,可以正常执行,经过-O2优化编译后,代码被卡住.整体功能涉及多进程,多线程操作. 问题发现 经过加打印,发现卡在while(a!0);//死循环,等待特殊事件发生来解开循环 a初始化为-1; 过一会后,另外有个线程,当特定事件发生的时候,将a置为0; 通过加打…

阻抗控制下机器人接触刚性环境振荡不稳定进行阻抗调节

在阻抗控制下,当机器人接触刚性环境时,可能会出现振荡不稳定的情况。这可以通过调整机器人的阻抗参数来进行调节。 阻抗接触 阻抗参数中的质量、阻尼和刚度都会对机器人控制系统的性能和稳定性产生重要影响。质量主要影响系统的惯性,从而影响…

调试文心大模型或chatgpt的function Calling函数应用场景

沉默了一段时间,最近都在研究AI大模型的产品落地应用,我觉得这个function calling出来后,对目前辅助办公有革命性的改变,可以它来做什么呢?我们先来调试看看,chatgpt和文心大模型的ERNIE Bot支持这个&#…

Python自动化测试PO模型封装过程详解

在自动化中, Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) ,通常 PO 模型可以大大提高测试用例的维护效率 优点:可重用,业务和对象分离,代码结构清晰,方便代码维护 核心要素 …

数字化智慧工地管理云平台源码(人工智能、物联网)

​智慧工地优势:"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合,…

【一周安全资讯1202】信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》;网络安全纳入注册会计师考试科目

要闻速览 1、信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》 2、南昌某高校学生个人信息在境外公开出售,警方抓获学校"内鬼" 3、网络安全纳入注册会计师考试科目 4、乌克兰情报机构网攻俄罗斯民航局,称俄民航业正…

合并一个文件夹下的多个txt文件,并对文本内容分列处理。

python 合并一个文件夹下的多个txt文件,并对文本内容分列。 原始文件: 最终结果: import pandas as pd import xlwt import pandas as pd from sqlalchemy import create_engine import pandas as pd import os import glob dirPath g…

【已解决】Win10端口被占用

​ 我总是在启动项目的时候失败,被告知端口号被占用,明明没有被占用(可能是系统卡了或者其它问题),但是又不想改端口号,或者重启电脑,那怎么办呢? 第一步:打开命令行窗口,以管理员…

mvc模式test

项目结构 Book.java package beans; public class Book {private Integer id;private String name;private double price;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(Strin…