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
相关产品推荐
相关产品推荐

