在PVE中,已打开特权LXC容器,并且
lxc.apparmor.profile: unconfined
已添加到其配置中。 Docker 也在这个容器内运行。特权 Docker 容器使用 --privileged
运行,非特权 Docker 容器使用 --security-opt apparmor=unconfined
运行,两者都可以正常工作。现在,当尝试使用 docker build
选项运行 --security-opt apparmor=unconfined
时,会出现以下错误:
#8 0.339 runc run failed: unable to start container process: error during container init: unable to apply apparmor profile: apparmor failed to apply profile: write /proc/self/attr/apparmor/exec: no such file or directory
这个问题有什么解决办法吗?
我不知道最新的 Proxmox gui,但是当我通过 linux cli 在 Ubuntu 20.04 LTS 主机上使用 Ubuntu18.04 LTS 创建并运行我的特权 LXC 容器时,我将以下几行添加到我的容器配置中:
# cat /var/lib/lxc/my_container_name/config
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =
security.nesting = true
security.privileged = true
使工作嵌套容器成为可能。
使用这些行,所有 Ubuntu 22.04 LTS、Debian 12 或 RHEL9 之前的特权 docker 容器都可以在此 LXC 容器中正常工作。
也可以在 LXC 中嵌套容器两次(是的,听起来很可怕,但我们用它来测试你的 ansible 角色)。因此,我们在 lxc-nested docker 中运行 docker,并在 lxc-nested docker 中运行 lxc:
SYS_ADMIN
能力;/run
、/tmp
和 /run/lock
tmpfs;/sys/fs/cgroup:/sys/fs/cgroup:rw
(或设置:ro
)从运行 docker 的主机绑定挂载。在这种情况下,我们也曾看到过有关
/proc/self/attr/apparmor
的错误消息。谷歌搜索了一下带来了答案,你的apparmor未能应用配置文件。这样你应该有更多的输出和日志:
apparmor_status
命令确保您的 apparmor 已启动。如果您不需要 apparmor,您也可以禁用它们 systemctl stop apparmor
以停止 apparmor 守护进程和/或:
$ sudo mkdir -p /etc/default/grub.d
$ echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0"' \
| sudo tee /etc/default/grub.d/apparmor.cfg
$ sudo update-grub
$ sudo reboot
(来自 Debian wiki)
运行
lxc-start <container-name> --logfile <log_name>; cat <log_name> directly from your host to see what's happened on container start. If your PVE controls containers over LXD you should use
lxc start --logfile 看起来你的容器配置中还需要行
lxc.apparmor.allow_incomplete = 1
(参见“lxc-start自debian 12.x升级以来失败(proxmox CT +嵌套lxc”)。所以将它们添加到你的/var/lib/lxc/<my_container_name>/config
文件中.