在Ubuntu上的Docker容器中,`mount --bind`命令失败

3
在我的Ubuntu 20.04应用程序中,由于需要为chroot挂载目录,我需要执行以下命令:
% execute outside the Docker container
# cd /tmp
# mkdir a b
# mount --bind a b

如果我不使用Docker容器,那么这个"mount-—bind"命令就会成功。但是,同样的命令在Docker容器内部会失败。
% execute in the docker container
# cd /app-data/
# mkdir a b
# mount --bind a b
mount: /app-data/b: bind /app-data/a failed.

我在 docker-compose.yaml 中使用 cap_add: SYS_ADMIN 来启动容器。

我该如何解决这个问题?

以下是执行环境的文件系统信息供参考:

% execute in the docker container
# df -T
Filesystem     Type    1K-blocks    Used Available Use% Mounted on
overlay        overlay  99014644 5453880  88511424   6% /
tmpfs          tmpfs       65536       0     65536   0% /dev
tmpfs          tmpfs     1017552       0   1017552   0% /sys/fs/cgroup
/dev/vda3      ext4     99014644 5453880  88511424   6% /app-data
shm            tmpfs       65536       0     65536   0% /dev/shm
tmpfs          tmpfs     1017552       0   1017552   0% /proc/acpi
tmpfs          tmpfs     1017552       0   1017552   0% /proc/scsi
tmpfs          tmpfs     1017552       0   1017552   0% /sys/firmware

% execute outside the Docker container
# df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
udev           devtmpfs    973876       0    973876   0% /dev
tmpfs          tmpfs       203512     828    202684   1% /run
/dev/vda3      ext4      99014644 5453880  88511424   6% /
tmpfs          tmpfs      1017552       0   1017552   0% /dev/shm
tmpfs          tmpfs         5120       0      5120   0% /run/lock
tmpfs          tmpfs      1017552       0   1017552   0% /sys/fs/cgroup
tmpfs          tmpfs       203508       0    203508   0% /run/user/1000
overlay        overlay   99014644 5453880  88511424   6% /var/lib/docker/overlay2/a393b5ab8ef81eb83d27565bc4695bbc899543aa075cbf7c1ccf6246ce846008/merged
shm            tmpfs        65536      16     65520   1% /var/lib/docker/containers/a4f2d1eff4b1a3ef1b8622fad4b529901fb415d77f17a31e8d9a0ed332d3819e/mounts/shm
overlay        overlay   99014644 5453880  88511424   6% /var/lib/docker/overlay2/a7453522f3e4a9f27c3cb20b0f3f4ebe75358ed9f5f909810ca18d836a601282/merged
shm            tmpfs        65536       0     65536   0% /var/lib/docker/containers/66a76b08846fbe38f633976bc8950ee414f867419310f8c612ce3aace8abfe0f/mounts/shm

你为什么想在容器内运行mount(8)命令?你是否有任何依赖于这个特定设置的相关应用代码,还是这个问题更多关乎Linux的机制? - David Maze
谢谢你的评论。 还有,谢谢你让我意识到这是一个奇怪的配置。 我决定不使用Docker。 - kjmtks
1个回答

3
有点晚回答原始请求者了,但我会分享解决方案,以防另一个人像我一样降落在这个页面上。我在这本书中找到了解决方案。除了添加SYS_ADMIN功能外,您还需要禁用AppArmor。您可以像这样运行容器:
docker run -it --cap-add SYS_ADMIN --security-opt apparmor=unconfined <image>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接