Bash 镜像有 bug
截止目前 bash 镜像 5.2.12 与 alpine 镜像 3.16,都有这个 bug。
复现问题
touch d && docker run -v $PWD/d:/d --rm -it bash:5.2
,进入容器后执行以下代码
[[ -x /d ]]
echo $?
ls -al /d
chmod -w /d
echo $?
ls -al /d
chmod -r /d
echo $?
echo $?
会打印上一行命令的状态码 (exit status),0 表示正常,非 0 表示错误。
你会发现三处 echo $?
都打印了 0
,即 /d
这个文件是可执行,可写,可读的,都不符合预期。 bash 4.4~5.2 我全试过了,都是一样的结果。
而在 bash 容器里执行下面代码,
touch a
touch b
chmod +x b
[[ -x a ]]
echo $?
[[ -x b ]]
echo $?
结果是打印了 1 0
,说明 a 是不可执行的,b 是可执行的,符合预期。
所以这个 BUG 只会出现在对于挂载宿主机到容器的文件的文件属性 test。
原因
bash 基于 alpine 镜像,但是 alpine 镜像自 3.14 起,对 faccessat2
syscall 有了调整。 如果宿主机的 libseccomp
不支持 faccessat2
,那 bash 的 [[ -r ]]
, [[ -w ]]
, [[ -x ]]
都会出问题。
详见 https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2 ,它也提供了一些解决方法,虽然很鸡肋。
https://github.com/alpinelinux/docker-alpine/issues/156 这楼里的一些问题我测试了,没有复现问题。
faccessat 的作用
faccessat - check user’s permissions of a file relative to a directory file descriptor
https://linux.die.net/man/2/faccessat https://man.archlinux.org/man/faccessat2.2.en