将 docker 搬回家后,容器中的权限被拒绝

Posted

技术标签:

【中文标题】将 docker 搬回家后,容器中的权限被拒绝【英文标题】:permission denied in containers after moving docker home 【发布时间】:2019-08-20 02:54:07 【问题描述】:

最初 docker 文件系统位于 /var/lib/docker 一切正常,但由于空间限制,我们不得不 移动到 /Proj/docker & docker 服务正在运行。

Active: active (running) since Thu 2019-03-28 09:36:59 UTC; 22h ago Docs: https://docs.docker.com Main PID: 27007 (dockerd) Tasks: 27 Memory: 726.5M CGroup: /system.slice/docker.service └─27007 /usr/bin/dockerd --selinux-enabled -g /Proj/docker

但在那之后,我的权限被拒绝了

  [user@host]# sudo docker run  -it oraclelinux:7-slim bash
 bash-4.2# ls
  ls: cannot open directory : Permission denied

**unless I am running  with privilage flag set to true** 

  [user@host]# sudo docker run  -it --privileged=true  oraclelinux:7-slim bash
 bash-4.2# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Can you please help to resolve this  

please find additional info

[user@host ~]$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker-sysconfig.conf, https-proxy.conf
   Active: active (running) since Thu 2019-03-28 09:36:59 UTC; 1 day 2h ago
     Docs: https://docs.docker.com
 Main PID: 27007 (dockerd)
    Tasks: 27
   Memory: 726.9M
   CGroup: /system.slice/docker.service
           └─27007 /usr/bin/dockerd --selinux-enabled -g /Proj/docker

		   


[user@host ~]$ cat /etc/systemd/system/docker.service.d/docker-sysconfig.conf
[Service]
ExecStart=
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/dockerd \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $INSECURE_REGISTRY \
          -g /Proj/docker
		  
		  
[user@host ~]$ cat /etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://proxyip:port"



[user@host~]# ls -lrth /Proj/docker
total 56K
drwx------.  4 root root 4.0K Mar 22 07:42 plugins
drwx------.  3 root root 4.0K Mar 22 07:42 image
drwx------.  2 root root 4.0K Mar 22 07:42 volumes
drwx------.  2 root root 4.0K Mar 22 07:42 trust
drwxr-x---.  3 root root 4.0K Mar 22 07:42 network
drwx------.  2 root root 4.0K Mar 22 07:42 swarm
drwx------.  2 root root 4.0K Mar 22 07:42 builder
drwx------.  4 root root 4.0K Mar 22 07:42 buildkit
drwx------.  2 root root 4.0K Mar 28 09:36 runtimes
drwx------.  2 root root 4.0K Mar 28 13:02 tmp
drwx------. 33 root root  12K Mar 29 07:45 overlay2
drwx------.  6 root root 4.0K Mar 29 07:45 containers

【问题讨论】:

您能提供更多信息吗?您是否对 daemon.json 应用了必要的更改以更改 docker 的路径?像 "graph":"/YourNewPath/Storage",你能提供 systemctl status docker 是 root 拥有的新路径,你的用户是 docker 组的一部分吗? 嘿 Ikaro0,我添加了一些额外的细节,希望对您有所帮助 尝试禁用 SELinux 看看是否是这个原因。 感谢 BMitch 禁用 SELinux 解决了问题,但我不认为 dat 将成为生产环境的永久解决方案 @Raja 同意,这不是解决方案,但至少您知道要解决的问题在哪里。有一个 SELinux 包来设置策略,不确定它是否旨在支持不同的位置。让 SELinux 处于允许/记录状态,并查看记录的违规列表,或者获取为 /var/lib/docker 设计的策略并将它们应用到新位置。 【参考方案1】:

我们也确实更改了 docker 图,所以我们所做的是在 RedHat 7.6 上进行跟踪:

停止 dockerd 将所有内容从 /var/lib/docker 移动到 /Docker/Storage 更改 /etc/docker/daemon.json 上的配置:

"graph":"/Docker/Storage"

并且:

/usr/lib/systemd/system/docker.service:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process
然后 systemctl daemon-reload 最后 systemctl start dockerd

希望对你有帮助

【讨论】:

我会试试这个Ikaro0【参考方案2】:

正如您在 cmets 中所述,当 SELinux 规则最终以错误的权限创建容器文件夹(在您的情况下为 /Proj/docker/containers)时,可能会发生这种情况。

按照this answer 中概述的建议,一种解决方法可能是运行

chcon -Rt svirt_sandbox_file_t /Proj/docker

【讨论】:

【参考方案3】:
    在进行复制时,请使用“-p”选项来保留属性。这解决了我这边的问题。 确保您的目标分区没有设置“nosuid”选项。检查 /etc/fstab。否则,您将遇到其他权限问题。 https://github.com/wodby/docker4drupal/issues/388

现在所有权限问题都已解决。

【讨论】:

以上是关于将 docker 搬回家后,容器中的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 docker-compose 期间尝试访问容器中的文件时权限被拒绝(UBUNTU 20.04)

运行 bash 脚本的 docker 入口点得到“权限被拒绝”

Docker容器内的权限被拒绝

Docker php apache权限被拒绝

使用非root用户时,Docker节点权限被拒绝

docker 和 elastic beanstalk 容器意外停止并且权限被拒绝