• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go 应用程序使用 dockerfile multi-stage 的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

场景重现

一个简单的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的交叉编译
    • 对交叉编译不是很了解...有机会再尝试

参考


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Mac 下用 go 开发Android应用环境设置发布时间:2022-07-10
下一篇:
GO test的用法发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap