场景重现

一个简单的go应用,准备通过docker部署,为了减少运行时的镜像和容器体积,使用了multi-stage构建:

# dockerfile 大致如下

# 一级构建使用带golang环境的镜像
FROM golang:1.8.3 AS app-build
WORKDIR /go/src/app/
RUN go install
# 生成可执行文件 # 二级构建使用alpine:3.7,体积小
FROM alpine:3.7
# 拷贝上面一级构建中生成的可执行文件
COPY --from=golb-build ./go/bin/app .
ENTRYPOINT ["/go/bin/app"]

dockefile生成构建是正常,运行container的时候会报错:

docker run --name app-1 --publish 80:80 -it app:latest
standard_init_linux.go:195: exec user process caused "no such file or directory"

问题原因

据说是镜像golangalpine的操作系统虽然都是linux,但是底层架构不一样,所以在golang镜像生成的可执行文件没法在alpine操作系统上运行(在哪里看到的英文解释,再看到的话补上链接)

  • debian/ubuntu等linux下通用的是glibc;
  • 但alpine下使用的musl libc.

解决方案

  1. 尝试用带golang环境的alpine镜像来构建,然后把构建生成的可执行文件拷贝到纯净的alpine镜像中,这样就不存在上面的问题了.

    • 尝试使用镜像golang:1.9.4-alpine3.7,发现执行到go get -v .时保存,该镜像内不包含git工具...
    • 构建镜像中安装git工具apk add --no-cache git...
    • 最后镜像生成,容器运行成功.镜像大小仅有13MB...
  2. 尝试golang的交叉编译
    • 对交叉编译不是很了解...有机会再尝试

参考

Go 应用程序使用 dockerfile multi-stage 的问题的更多相关文章

  1. 基于官方Drone-CI 的alpine版本asia亚洲时区构建支持. Drone-CI based alpine Timezone Build

    基于官方Drone-CI 的alpine版本最简化添加亚洲时区Dockerfile构建支持. iotd@Github: drone-ci-based-alpine-timezone-build 如添加 ...

  2. Dockerfile 中的 multi-stage

    在应用了容器技术的软件开发过程中,控制容器镜像的大小可是一件费时费力的事情.如果我们构建的镜像既是编译软件的环境,又是软件最终的运行环境,这是很难控制镜像大小的.所以常见的配置模式为:分别为软件的编译 ...

  3. Dockerfile 中的 multi-stage(多阶段构建)

    在应用了容器技术的软件开发过程中,控制容器镜像的大小可是一件费时费力的事情.如果我们构建的镜像既是编译软件的环境,又是软件最终的运行环境,这是很难控制镜像大小的.所以常见的配置模式为:分别为软件的编译 ...

  4. 开发Adobe AIR移动应用程序的考虑事项

    http://www.adobe.com/cn/devnet/air/articles/considerations-air-apps-mobile.html Adobe AIR 经过发展演进,已经超 ...

  5. Win8 安装Oracle 10g 提示“程序异常终止”的解决方案

    这段时间在做DRP,需要安装Oracle 10g的数据库,我的系统是win8企业版,安装Oracle 10g的时候,选择“高级安装”,提示“程序异常终止”,下面是几个解决方案,跟大家分享一下. 错误提 ...

  6. docker制作node程序镜像:

    准备: 需要5个文件 新建一个docker文件夹 1 .ignore git忽略文件用的 2 pakage.json 安装NODE程序的 也可以直接拷贝进 docker文件加 3 node环境 lin ...

  7. 使用eclipse和JavaFX Scene Builder进行快速构建JavaFX应用程序

    http://blog.csdn.net/wingfourever/article/details/7726724 使用eclipse和JavaFX Scene Builder进行快速构建JavaFX ...

  8. 注册Azure AD 2.0 应用程序

    作者:陈希章 发表于 2017年3月22日 上一篇 介绍了Microsoft Graph应用程序的一些概念,以及目前还比较普遍的Azure AD 1.0应用程序的注册方式.但正如我多次提到的那样,虽然 ...

  9. 利用dockerfile定制镜像

    利用dockerfile定制镜像 镜像的定制就是定制每一层所添加的配置.文件.如果可以吧每一层修改.安装.构建.操作的命令都写入到一个脚本,用脚本来构建.定制镜像,这个脚本就是dockerfile. ...

  10. 8、Dockerfile介绍和最佳实践

    一.Dockerfile 概念 1.Dockerfile是什么 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的一些配置参数(如 ...

随机推荐

  1. (.net core)Kong网关的使用

    一.优势: 提供统一的 API 管理,简化流量控制.负载均衡.安全性控制等工作. 有可视化界面可操作,支持高度 可扩展性,可以通过插件来扩展功能. 在 微服务架构 中表现优异,支持多种协议和高并发场景 ...

  2. Solution -「ZJOI 2018」「洛谷 P4338」历史

    \(\mathscr{Description}\)   Link.   给定一棵以 \(1\) 为根的树,点 \(u\) 有非负点权 \(a_u\).   定义 \(u\) 的一次染色的代价为:路径 ...

  3. ofd轻阅读---采用Typescript全新开发,让阅读、批注更方便!

    前言  浏览器内核已支持pdf文件的渲染,这极大的方便了pdf文件的阅读和推广.ofd文件作为国产板式标准,急需一套在浏览器中渲染方案. 本人研究ofd多年,分别采用qt.c# 开发了ofd阅读器.本 ...

  4. K_V键值存储对比

    memcached-键值存储 redis-键值存储 RocksDB-键值存储 KeyDB-键值存储 DynamoDB-键值存储 levelDB-键值存储 etcd-键值存储 Redis与其他数据库对比 ...

  5. w3cschool-微信小程序开发文档-API

    https://www.w3cschool.cn/weixinapp/weixinapp-network-request.html 微信小程序API 发起请求 发起 HTTPS 网络请求.使用前请注意 ...

  6. 轮播图,swiper使用

    背景: 最近接到一个需求,重写首页,需要用到轮播图. 但是轮播图只用两张图,此为前提. 本想直接用ElementUI的走马灯,但是只用两张图的情况下,走马灯不能循环播放,只能来回播放,公司的UI小姐姐 ...

  7. .NET Core 中如何构建一个弹性的 HTTP 请求机制?

    1. 理解弹性 HTTP 请求机制 什么是弹性? 弹性是指系统在面对故障或异常情况时,能够保持或快速恢复到正常状态的能力.在 HTTP 请求的上下文中,弹性意味着当请求失败时,系统能够自动采取一系列措 ...

  8. 从理房间到移动零:一道考察数组操作的经典题目|LeetCode 283 移动零

    LeetCode 283 移动零 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有整理过房间?常常会发现一些要丢掉的东西,但又不想立刻处 ...

  9. [文件格式/数据存储] Parquet:开源、高效的列式存储文件格式协议

    序:缘起 => 用 java 读取 parquet 文件 生产环境有设备出重大事故,又因一关键功能无法使用,亟需将生产环境的原始MQTT报文(以 parquet 文件格式 + zstd 压缩格式 ...

  10. 全网最简单DeepSeek-R1本地部署教程

    1.安装ollama 打开ollama网址:https://ollama.com/ 选择你电脑的系统进行下载 我的电脑是windows的就点击windows然后点击下载即可 下载完毕后双击打开下载的. ...