当前位置: 首页 > news >正文

docker_构建镜像成功但启动容器的执行程序总是报文件找不到(lesson)

碰到问题

有一次做了一个镜像,制作成功,但运行容器总是报错:找不到文件。
dockerfile如下:

FROM golang:1.18 AS builder
WORKDIR /app
COPY go.mod main.go ./
RUN go mod download
COPY . .
RUN go build -o tools_cpu_burner_by_api .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/tools_cpu_burner_by_api .
RUN chmod +x /root/tools_cpu_burner_by_api
CMD ["./tools_cpu_burner_by_api"]

排查问题

镜像生成后,使用 下面命令进入容器,查找可执行文件 tools_cpu_burner_by_api

docker run -it --entrypoint /bin/sh tools_cpu_burner_by_api
ls -l /root/

发现文件存在,权限正常,但是不能执行,一执行就报错:文件找不到
又使用

ldd ./tools_cpu_burner_by_api

发现使用了3个动态链接库(其实是由于alpine操作系统比较精简,缺少很多动态库导致)

问题解决

原因是最后制作镜像的时候使用了alpine,缺少一些动态库,所以解决方法就是不使用动态库,
把go标准库涉及的到的动态库(标准库有使用cgo)都重新编译成静态库打包到程序中即可。
修改后的dockerfile如下

FROM golang:1.18 AS builder
WORKDIR /app
COPY go.mod main.go ./
RUN go mod download
COPY . .
# 构建 Go 应用程序
# RUN go build -o tools_cpu_burner_by_api .    # 使用动态库编译会出问题
# 使用静态库编译
# CGO_ENABLED=0:这是一个环境变量设置。当设置为0时,它告诉Go编译器在编译过程中不使用cgo。
# 		cgo是Go与C语言交互的一个工具,允许在Go代码中调用C代码。
# 		要确保你的程序是纯Go的,不依赖于任何C库或代码,所以设置CGO_ENABLED=0。
# -installsuffix cgo: 当CGO_ENABLED=0时,这个标志用于修改包的安装后缀,
# 		可以确保生成的包与默认包有所不同,从而避免冲突。
# -a: 这个标志告诉Go编译器强制重新构建所有涉及的包,即使它们是最新的。
# 		这可以确保所有的依赖项都是最新的,并且没有使用任何旧的或缓存的版本。
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o tools_cpu_burner_by_api .# 使用一个较小的镜像来运行应用程序(多阶段构建)
FROM alpine:latest
# 设置工作目录
WORKDIR /root/
# 从构建阶段复制可执行文件
COPY --from=builder /app/tools_cpu_burner_by_api .
# 确保文件存在并具有执行权限
RUN chmod +x /root/tools_cpu_burner_by_api
# 启动应用程序
CMD ["./tools_cpu_burner_by_api"]

至此,问题解决

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++面向对象程序设计 - 异常处理
  • C#上位机开发
  • 【python010】获取任意多边形区域内的经纬度点并可视化
  • 单向环形链表的创建与判断链表是否有环
  • 【ArcGISPro SDK】构建多面体要素
  • matlab 异常值检测与处理——Z-score法
  • 软件设计师笔记-程序语言基础知识
  • 电子电气架构 --- 信息安全测试模糊测试
  • 【iOS】界面推出的方法
  • Opencv图像处理
  • HTML LocalStorage
  • 第1期测试社招面试经验月报
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • linux的持续性学习
  • C++ 中有符号数与无符号数的隐式转换与运算陷阱
  • [case10]使用RSQL实现端到端的动态查询
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CentOS 7 防火墙操作
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java到底能干嘛?
  • js对象的深浅拷贝
  • JS题目及答案整理
  • KMP算法及优化
  • React+TypeScript入门
  • Redis 中的布隆过滤器
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 聊一聊前端的监控
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 全栈开发——Linux
  • 如何用vue打造一个移动端音乐播放器
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • zabbix3.2监控linux磁盘IO
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ###项目技术发展史
  • #define 用法
  • #NOIP 2014# day.2 T2 寻找道路
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Python第六天)文件处理
  • (二)JAVA使用POI操作excel
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一) 初入MySQL 【认识和部署】
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net2005怎么读string形的xml,不是xml文件。
  • .Net实现SCrypt Hash加密
  • .sys文件乱码_python vscode输出乱码
  • @angular/cli项目构建--http(2)
  • [20170705]diff比较执行结果的内容.txt
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心