gpt4 book ai didi

docker - 尝试从Docker容器访问共享内存时“Permission denied”,即使--ipc设置为“host”

转载 作者:行者123 更新时间:2023-12-02 19:45:07 25 4
gpt4 key购买 nike

我正在尝试在主机计算机中设置共享内存,并使用centos:7函数在shmat docker容器中访问它。
我使用ipcmk -M 1024创建了一个共享内存,并编写了一个ID为硬编码的C程序(用于调试):

// shmtest.c
const char* shm_id = "98321";

shared_memory = shmat(atoi(shm_id), NULL, 0);

if (shared_memory == (void*)-1) {
perror("Can't access shared memory!");
abort();
}

fprintf(stdout, "Shared memory found!\n");
我的Dockerfile非常简单,我要做的就是复制编译后的程序并使容器保持 Activity 状态,以便我可以使用交互式 shell 对其进行检查:
# Dockerfile
FROM centos:7
COPY ./shmtest /root/
CMD tail -f /dev/null
我使用以下命令构建并启动容器
docker build -t shm-docker .
docker run --ipc="host" shm-docker
在docker容器中,我运行了 shmtest程序,但无法访问共享内存:
./shmtest 
No shared memory area!: Permission denied
Aborted
但是, ipcs显示共享内存:
ipcs -m | grep 98321
0x8a39b8b3 98321 1000 644 65536 0
我试过了:
  • -v /dev/:/dev/-v /dev/shm/:/dev/shm/启动docker容器,没有任何运气
  • 使用setcap为程序提供CAP_IPC_OWNER和CAP_IPC_LOCK功能;然后我无法运行它(./shmtest: Operation not permitted)
  • 使用centos:7切换Dockerfile中的ubuntu:18.04仍然不起作用,这意味着此问题并非特定于centos

  • 不幸的是,我对权限了解不多,但是我注意到我的共享内存在运行 644时显示数字 ipcs,而其他各种显示 600。我也尝试访问那些,但仍然遇到相同的错误。
    我在这里想念什么?我的想法是否有效,还是无法以这种方式访问​​共享内存?

    最佳答案

    共享内存的644权限允许其所有者进行读取和写入(前6个),但仅授予其他所有人(后4个)读权限。
    docker容器中的root用户不是共享内存的所有者,因此他无权写入共享内存。
    如果您有权使用创建共享内存的工具,则可以将权限更改为606之类的东西,这意味着对所有者和其他所有人的读写访问权限。例如,ipcmk命令具有-p选项,因此您将运行ipcmk -M 1024 -p 0606
    如果您无法更改共享内存的创建方式,则可以通过在--privileged命令中添加--cap-add=IPC_OWNER标志或更准确地说是docker run标志来解决。从docker run reference:

    When the operator executes docker run --privileged, Docker will enable access to all devices on the host as well as set some configuration in AppArmor or SELinux to allow the container nearly all the same access to the host as processes running outside containers on the host.


    In addition to --privileged, the operator can have fine grain control over the capabilities using --cap-add and --cap-drop.


    关于 IPC_OWNER功能:

    IPC_OWNER - Bypass permission checks for operations on System V IPC objects.


    现在完整的命令是
    docker run --ipc="host" --privileged shm-docker
    要么
    docker run --ipc="host" --cap-add=IPC_OWNER shm-docker
    了解权限的一个很好的工具是 Chmod Calculator,它是一个交互式工具,它也可以查看权限如何以八位数字和字符编码。

    关于docker - 尝试从Docker容器访问共享内存时“Permission denied”,即使--ipc设置为“host”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63938723/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com