系统上启用了 AppArmor,但无法加载 docker-default 配置文件

系统上启用了 AppArmor,但无法加载 docker-default 配置文件

我一直在努力解决在 Dell 5100 IoT Edge Gateway 上运行 docker snap 的问题。我有另一个 Dell Gateway - 3001 - 不会遇到此问题。

以下是我在 Dell 5100 Gateway 上执行的步骤:

安装了 Docker Snap,以下是“snap list”的输出:

admin@localhost:~$ snap list
Name             Version          Rev  Developer   Notes
bluez            5.44-2           84   canonical   -
core             16.04.1          394  canonical   -
docker           17.03.1-ce-1     124  docker-inc  -
modem-manager    1.6.2-5          82   canonical   -
network-manager  1.2.2-10.2       166  canonical   -
snapweb          0.26.1           207  canonical   -
stlouis          16.04-1.13       11   canonical   -
stlouis-kernel   4.4.0-77-1       19   canonical   -
tpm2             1.0-4            18   canonical   -
uefi-fw-tools    1.4.1-0.7.2+git  7    canonical   -

安装后,我运行了 docker.help 中所述的命令来启用正确的 snap 接口:

sudo snap connect docker:home :home

运行上面#2中的命令后“snap interface”命令的输出。

$ snap interfaces | grep docker
:docker-support           docker:privileged,docker:support
:firewall-control         docker
:home                     docker
:network                  docker,snapweb,tpm2,uefi-fw-tools
:network-bind             docker,snapweb,tpm2
docker:docker-daemon      docker:docker-cli
admin@localhost:~$

然后我使用以下命令检查了 docker 的 apparmor 状态:

与我看到的同一命令的 3001 输出不同,docker-default缺少:

$ sudo aa-status | grep docker
   snap.docker.compose
   snap.docker.docker
   snap.docker.dockerd
   snap.docker.help
   snap.docker.dockerd (1582)
   snap.docker.dockerd (1627)

以下是 Dell 3001 网关的 apparmor 状态和 snap 列表的输出:

3001 和 5100 之间的最大区别在于操作系统版本 - 我对 Ubuntu Core 非常陌生,无法弄清楚为什么 apparmor 状态中缺少 docker-default。我已经重新启动、恢复出厂设置并尝试了许多其他方法。出现的问题如下:

我可以拉取图像,并且它可以工作,我使用了以下命令:

sudo docker pull eclipse-mosquitto:1.4.10

图像已被拉出,但是当我尝试运行它时:

$ sudo docker run -d -p 1883:1883 -p 9001:9001 --name mqtt -t eclipse-mosquitto:1.4.10
d11e29c04064ea3c546c6c9141abae73508dd2cc98492860accb4461af40b661
docker: Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded...

我也尝试使用无限制策略来运行它,然后我得到了oci runtime error

$ sudo docker run -d --security-opt apparmor=noconfinement -p 1883:1883 -p 9001:9001 --name mqtt -t
eclipse-mosquitto:1.4.10
fe501196f9ac0d27e82b43069aafee4c806d80c1ae9ce363040b96996d74f963
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused
"process_linux.go:258: applying cgroup configuration for process caused \"mkdir /var/lib/snapd/hostfs/sys/fs/cgroup/cpuset/docker: permission denied\"".

请注意,在 Dell 3001 Gateway 上执行相同的步骤不会出现上述两个问题。

答案1

首先,很抱歉没有收到对您非常重要的问题的任何回复。对于可能遇到同样问题的其他用户,问题的关键在于 3001 上 docker 可以成功运行的核心快照是较新的核心快照版本,而在 5100 上,核心快照停留在与工厂 Ubuntu Core 映像一起提供的相同过时版本。过时版本存在一个问题,导致无法正确接收较新版本的核心快照。Ubuntu Store 方面已解决此问题,因此可以将此较旧的核心快照更新为最新的验证版本,因此此特定问题不会影响其他任何人。

另外,为了方便以后参考,我想向你指出snapcraft.io 论坛其中讨论了一切快照和 Ubuntu Core。

答案2

您实际上缺少--security-opt seccomp:unconfined选项和-v /sys/fs/cgroup:/sys/fs/cgroup:ro绑定挂载(使用 docker snap 时它们都没有意义,因为它已经完全受限运行)因此使用:

--security-opt apparmor:unconfined --security-opt seccomp:unconfined -v /sys/fs/cgroup:/sys/fs/cgroup:ro

是正确的做法... 围绕 docker 可执行文件的 snap 限制将保证安全。

答案3

这看起来不太好,因为这是一个非常老的核心 snap 版本。基本上,这个问题发生过一次,是戴尔代表在 5 个月前报告的。

要解决这个问题。

  1. 请运行以下命令以使所有 snap 保持最新

    sudo snap refresh
    
  2. 如果你在从品牌商店更新核心 snap 时遇到以下问题

    Error cannot refresh "core" :cannot refresh "core" to  revision xxxx: no validation by "xxxxxx"
    

    这意味着核心快照尚未通过验证,尽管它已获得资格。但是,您仍然可以通过--ignore-validation运行以下命令来更新它:

    sudo snap refresh core --ignore-validation
    

根据 Jim 的建议,所有与 snap 和 ubuntu-core 相关的讨论现在都转移到了snapcraft.io论坛。它是进行快速讨论的首选场所,您总能及时获得反馈。

相关内容