Docker运行挂载目录可执行文件提示No such file or directory报错
问题描述
我尝试在容器中运行从/bin目录复制的ls副本(测试了容器内所有非/bin路径下的可执行文件均复现该问题),运行时出现报错:
docker run -v ~/Desktop/test:/test alpine:latest /test/ls exec /test/ls: no such file or directory
当执行命令查看挂载目录时,可以看到该文件确实存在:
docker run -v ~/Desktop/test:/test alpine:latest ls /test ls
已尝试的排查操作:
- 为文件设置
chmod +x执行权限,问题无变化 - 更换基础镜像,问题无变化
- 通过
apt-get update && apt-get upgrade更新Docker及所有系统软件包,问题无变化
环境信息
- 宿主机操作系统:Ubuntu 20.04.3 LTS
- Docker版本:20.10.17,构建号100c701
容器inspect信息
{ "Id": "abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33", "Created": "2022-06-13T19:59:49.630474765Z", "Path": "/test/ls", "Args": [], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 1, "Error": "", "StartedAt": "2022-06-13T19:59:50.017551978Z", "FinishedAt": "2022-06-13T19:59:50.016401363Z" }, "Image": "sha256:0ac33e5f5afa79e084075e8698a22d574816eea8d7b7d480586835657c3e1c8b", "ResolvConfPath": "/var/lib/docker/containers/abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33/resolv.conf", "HostnamePath": "/var/lib/docker/containers/abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33/hostname", "HostsPath": "/var/lib/docker/containers/abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33/hosts", "LogPath": "/var/lib/docker/containers/abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33/abd66c400e6f58313d71c63c92688472874cdd4393d42e22df23a90264083b33-json.log", "Name": "/cranky_pare", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "docker-default", "ExecIDs": null, "HostConfig": { "Binds": [ "/home/egor/Desktop/test:/test" ], "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "CgroupnsMode": "host", "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "private", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DeviceRequests": null, "KernelMemory": 0, "KernelMemoryTCP": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": null, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/115140c86b11eb773f30d2329ec05388224e75dfbcef9977c87bb3f0e32e8769-init/diff:/var/lib/docker/overlay2/22348355d634b9183f798e9622f71809a9a62a7c6accdf723aa72d979e3ba7f4/diff", "MergedDir": "/var/lib/docker/overlay2/115140c86b11eb773f30d2329ec05388224e75dfbcef9977c87bb3f0e32e8769/merged", "UpperDir": "/var/lib/docker/overlay2/115140c86b11eb773f30d2329ec05388224e75dfbcef9977c87bb3f0e32e8769/diff", "WorkDir": "/var/lib/docker/overlay2/115140c86b11eb773f30d2329ec05388224e75dfbcef9977c87bb3f0e32e8769/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/home/egor/Desktop/test", "Destination": "/test", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "abd66c400e6f", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/test/ls" ], "Image": "alpine:latest", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "fb64f195f203033f02b9c5555e0b1d2cdd2819f3ac12f3046416f8e13378bc3d", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/fb64f195f203", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "cb261cd6eca2ddb567984e2d7d9e6df14008c774d73f0d76129da6c8edc6955c", "EndpointID": "", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } }, "CreatedTime": 1655150389630 }
问题原因
这个报错和文件权限、Docker版本、挂载配置都没关系,是Linux下执行二进制文件的典型误导性报错:当二进制依赖的动态链接器(ELF解释器)不存在时,系统会直接返回no such file or directory,不会提示具体缺失的依赖文件。
你的ls文件是从Ubuntu宿主机的/bin目录复制的,Ubuntu的二进制默认动态链接到glibc库,对应的动态链接器路径是/lib64/ld-linux-x86-64.so.2;而Alpine镜像为了精简体积,默认使用musl libc,根本没有提供glibc的链接器和依赖库,所以内核加载这个ls二进制时找不到对应的解释器,直接抛出文件不存在的错误。
你观察到的“容器内非/bin路径的可执行文件都复现问题”,本质逻辑完全一致:只要是从宿主机复制过去的、动态链接glibc的二进制,不管放在哪个路径下,在Alpine里运行都会报这个错,和路径位置没有关系。
验证方法
可以直接在容器内查看这个ls二进制的动态依赖,执行命令:
docker run -v ~/Desktop/test:/test --rm alpine:latest ldd /test/ls
输出会明确显示找不到/lib64/ld-linux-x86-64.so.2这个链接器文件。
解决方案
根据实际需求选一种即可:
- 使用匹配的基础镜像:如果要运行宿主机Ubuntu上复制的glibc动态链接二进制,不要用Alpine镜像,换成Ubuntu、Debian这类默认集成glibc的基础镜像即可正常运行。
- 在Alpine内安装glibc兼容层:如果必须使用Alpine镜像,可以手动添加glibc运行环境,但兼容性不如直接使用glibc基础镜像稳定。
- 编译静态链接二进制:编译时增加静态链接参数,把所有依赖都打包进二进制文件,不需要依赖系统动态库,可以在任意同架构Linux环境下运行。
内容的提问来源于stack exchange,提问作者klynxe
相关产品推荐
相关产品推荐

