問題:跟往常一樣執行docker-compos exec redis sh時出現如下錯誤,而容器是運行狀態中。
# docker-compose exec redis sh rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "process_linux.go:75: starting setns process caused \"fork/exec /proc/self/exe: no such file or directory\""
解決辦法:
1、獲取容器ID
# docker ps | grep arcs_redis_1 ac248a3c5c0e redis:alpine "docker-entrypoint..." 2 years ago Up 16 minutes 6379/tcp arcs_redis_1
2、通過容器ID獲取容器的PID
# ps -ef|grep libcontainerd | grep ac248a3c5c0e root 6650 9053 0 11:14 ? 00:00:00 docker-containerd-shim ac248a3c5c0e3f6405c35e186b5d095aeb7af72b0f52bb08303baded251cdb61 /var/run/docker/libcontainerd/ac248a3c5c0e3f6405c35e186b5d095aeb7af72b0f52bb08303baded251cdb61 docker-runc
注:第二個字段為容器的PID
3、獲取容器的mount位置
# grep "path" /var/run/docker/libcontainerd/ac248a3c5c0e3f6405c35e186b5d095aeb7af72b0f52bb08303baded251cdb61/config.json
注:mount的路徑:{"path":"/var/lib/docker/devicemapper/mnt/cc2ff9576cdf7736acca50ffdaadef471e01a8ffe9acb039c1d423edd941bd38/rootfs"},此路徑用於第6步掛載時使用。
4、用nsenter進入容器的namespace
# nsenter -m -t 6650 bash
注: 6650是容器的PID
5、查看容器的DeviceName
# docker inspect --format='{{.GraphDriver.Data.DeviceName}}' ac248a3c5c0e ####ac248a3c5c0e是容器ID
docker-252:0-9700888-cc2ff9576cdf7736acca50ffdaadef471e01a8ffe9acb039c1d423edd941bd38
6、手動掛載
# mount /dev/mapper/docker-252\:0-9700888-cc2ff9576cdf7736acca50ffdaadef471e01a8ffe9acb039c1d423edd941bd38 -o rw,relatime,nouuid,attr2,inode64,sunit=512,swidth=1024,noquota -t xfs /var/lib/docker/devicemapper/mnt/cc2ff9576cdf7736acca50ffdaadef471e01a8ffe9acb039c1d423edd941bd38
7、退出
#exit
8、再次執行docker-compose exec redis sh 無報錯。
說明:此報錯是由於mount掛載點丟失,具體原因目前還未知曉,若有知曉者歡迎告知!