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


    场景重现

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

    参考

  • 相关阅读:
    起点中文网小说爬取-etree,xpath,os
    拉勾网爬虫--待改正
    破解有道词典翻译-版本二
    pycharm错误:11001
    自动化selenium 测试之道(一)
    valgrind 详细说明
    sar命令使用详解
    Linux CPU实时监控mpstat命令详解
    Linux IO实时监控iostat命令详解
    RPM安装命令总结
  • 原文地址:https://www.cnblogs.com/taadis/p/12111631.html
Copyright © 2020-2023  润新知