You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker基于distroless镜像运行时部分可执行文件提示不存在求助

问题:distroless/static:nonroot容器中存在的二进制文件无法执行,提示"exec /manager: no such file or directory"

使用distroless/static:nonroot镜像构建容器后,运行时执行/manager提示exec /manager: no such file or directory,但通过dive工具确认该文件确实存在于根目录。同时容器内的ls、tail、manager均无法执行,仅自行编译的test程序可以正常运行(修改ENTRYPOINT为/test后能正常输出日志)。


相关信息

1. Dockerfile内容

FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY ls .
COPY tail .
COPY test .
COPY manager .
ENTRYPOINT ["/manager"]

2. 构建及运行命令

[root@master go-docker-test]# docker build -t strangething:v1.13 .
[root@master go-docker-test]# docker run -d strangething:v1.13
[root@master go-docker-test]# docker logs b2

3. 日志输出

exec /manager: no such file or directory

4. dive工具查看的容器文件结构(确认文件存在)

[Layers]───────────────────────────────────────────────────────────────────── [● Current Layer Contents]──────────────────────────────────────────────────
Cmp Image ID                     Size  Command                                Permission    UID:GID       Size  Filetree
    sha256:cb60fb9b862c6a89f9  2.3 MB  FROM sha256:cb60fb9b862c6a89f9         drwxr-xr-x        0:0     2.3 MB  ├── .
    sha256:3e884d7c2d4ba9bac6  118 kB  COPY ls . # buildkit                   drwxr-xr-x        0:0        0 B  │   ├── bin
    sha256:e75e9da8f1605f7944   67 kB  COPY tail . # buildkit                 drwxr-xr-x        0:0        0 B  │   ├── boot
    sha256:7a0f1970f36a364672  1.8 MB  COPY test . # buildkit                 drwxr-xr-x        0:0        0 B  │   ├── dev
    sha256:c9ab59cb1ce11477ca   47 MB  COPY manager . # buildkit              drwxr-xr-x        0:0     220 kB  │   ├─⊕ etc
                                                                              drwxr-xr-x 65532:65532        0 B  │   ├─⊕ home
[Layer Details]────────────────────────────────────────────────────────────── drwxr-xr-x        0:0        0 B  │   ├── lib
                                                                              drwxr-xr-x        0:0        0 B  │   ├── proc
Digest: sha256:c9ab59cb1ce11477cac4d634bb81cf7316c344b50f01a62a8e5ddcf355d5fe drwx------        0:0        0 B  │   ├── root
cf                                                                            drwxr-xr-x        0:0        0 B  │   ├── run
Tar ID: 998c57d00785ccffaf3b308a529c7f816633897097d1ef6519269a8e3c5af59b      drwxr-xr-x        0:0        0 B  │   ├── sbin
Command:                                                                      drwxr-xr-x        0:0        0 B  │   ├── sys
COPY manager . # buildkit                                                     drwxrwxrwx        0:0        0 B  │   ├── tmp
                                                                              drwxr-xr-x        0:0     2.1 MB  │   ├─⊕ usr
[Image Details]────────────────────────────────────────────────────────────── drwxr-xr-x        0:0     1.8 kB  │   └─⊕ var
                                                                              -rwxr-xr-x        0:0     118 kB  ├── ls
Total Image size: 51 MB                                                       -rwxr-xr-x        0:0      47 MB  ├── manager
Potential wasted space: 0 B                                                   -rwxr-xr-x        0:0      67 kB  ├── tail
Image efficiency score: 100 %                                                 -rwxr-xr-x        0:0     1.8 MB  └── test

Count   Total Space  Path

5. 自定义test程序代码(test.go)

package main

import (
        "fmt"
)
type Per struct {
        Name string
        Age int
}
type Person struct {
        Name string
        Age int
        Lov Per
}

func main() {
        var one Person
        one.Name="abc"
        one.Age=11
        var two Per
        one.Lov=two
        if one.Lov != (Per{}){
                fmt.Println("not empty!")
        }else {
                fmt.Println("empty")
        }
}

问题原因分析

核心原因是二进制文件的依赖库缺失:

  • distroless/static:nonroot是极简镜像,仅支持静态编译的二进制文件,不包含任何动态链接库(如libc、glibc等)。
  • 你自行编译的test程序是静态编译的(Go默认在多数场景下会生成静态二进制,或你编译时隐式指定了静态参数),因此无需依赖系统动态库即可运行。
  • 而ls、tail、manager均为动态编译的二进制,它们依赖系统级动态链接库,但distroless/static镜像中没有这些库,导致执行时系统无法找到依赖,从而抛出易混淆的"no such file or directory"错误(实际是找不到依赖库,而非文件本身不存在)。

可以在宿主机上用ldd manager或file manager命令验证:如果输出包含dynamically linked或列出了libc.so.6等动态库,即可确认是动态编译的。


解决办法

方案1:将manager改为静态编译(推荐,保持镜像极简)

如果manager是你开发的Go程序,编译时指定静态编译参数:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o manager main.go

该命令会生成完全静态的二进制文件,不依赖任何系统动态库,可直接在distroless/static:nonroot中运行。

方案2:改用包含动态库的distroless镜像

如果无法静态编译manager(比如是第三方二进制),可以切换到包含基础动态库的镜像,如distroless/base:nonroot或distroless/debian12:nonroot,这类镜像提供了libc等必要依赖:

FROM gcr.io/distroless/base:nonroot
WORKDIR /
COPY ls .
COPY tail .
COPY test .
COPY manager .
ENTRYPOINT ["/manager"]

内容的提问来源于stack exchange,提问作者HelpMePlease

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14