linux - Docker容器无法从主机访问映射目录

标签 linux docker-compose centos grafana influxdb

我在 CentOS 环境中运行 grafana 和 influxdb 容器,但是当我启动容器时,两者都表示无法在映射目录上创建文件。

我在 Ubuntu 上运行同样的环境,没有遇到任何问题。

我已经将目录更改为 472:472 我已经在 docker-compose.yml 中映射了所有者的用户 ID(在 ubuntu 中它解决了问题) 我的想法已经用完了!

这是启动容器的命令

CURRENT_UID=$(id -u):$(id -g) docker-compose -f /home/rastreamento/docker-compose.yml up -d

这是 docker-composer 的 yml,在 ubuntu 上运行良好:

version: '3'

services:
  grafana:
    image: "grafana/grafana"
    environment:
     - WORKING_DIR=/var/lib/grafana/working_dir
     - GF_SECURITY_DISABLE_GRAVATAR=true
     - GF_DEFAULT_INSTANCE_NAME=Valid
     - GF_SERVER_DOMAIN=200.166.40.21
     - GF_SERVER_ENFORCE_DOMAIN=false
     - GF_SERVER_ROOT_URL=http://200.166.40.21
     - GF_ANALYTICS_CHECK_FOR_UPDATES=false
     - GF_USERS_ALLOW_SIGN_UP=false
     - GF_USERS_VIEWERS_CAN_EDIT=false
    ports:
     - "1982:3000"
    volumes:
     - /home/dev/grafana:/var/lib/grafana
    links:
     - influxdb
    networks: 
      backend:
        ipv4_address: 172.20.0.3
    restart: unless-stopped
    depends_on:
     - influxdb
    user: ${CURRENT_UID}
  influxdb:
    image: "influxdb"
    environment:
     - INFLUXDB_ADMIN_ENABLED=true
     - INFLUXDB_DATA_MAX_SERIES_PER_DATABASE=0
     - INFLUXDB_DATA_MAX_VALUES_PER_TAG=0
    ports:
     - "8086:8086"
     - "8083:8083"
    volumes:
     - /home/dev/influxdb:/var/lib/influxdb
    networks: 
      backend:
        ipv4_address: 172.20.0.2
    restart: unless-stopped
    user: ${CURRENT_UID}
networks:
  backend:
    driver: bridge
    ipam:
      config:
      - subnet: 172.20.0.0/24

这是运行 Grafana 的容器的一个输出。

grafana_1 | mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied

InfluxDB 输出:

influxdb_1 | run: create server: mkdir all: mkdir /var/lib/influxdb/meta: permission denied

经过 2 天的研究,我现在已经没有办法解决这个问题了。

谢谢

编辑1:

根据 Jan Garaj 的询问,Docker 信息如下: ps。我更改了所需的主机映射,以使容器能够运行并访问它的 bash。

docker 信息

[rastreamento@VMINDUS ~]$ docker info
Containers: 30
 Running: 1
 Paused: 0
 Stopped: 29
Images: 2
Server Version: 1.13.1
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version:  (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: 9c3c5f853ebf0ffac0d087e94daef462133b69c7 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
 seccomp
  WARNING: You're not using the default seccomp profile
  Profile: /etc/docker/seccomp.json
 selinux
Kernel Version: 3.10.0-1062.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 2
Total Memory: 3.666 GiB
Name: VMINDUS
ID: ZOZE:KEGT:SKTP:SG5J:3DKD:LCT3:STRW:FDO4:SFDP:FJJK:IAKQ:72DW
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)

文件系统权限

[rastreamento@VMINDUS ~]$ ls -l
total 12
-rwxrwxrwx. 1 rastreamento docker 1221 Feb 11 15:05 docker-compose.yml
drwxr-xr-x. 2 root         root      6 Feb 11 15:54 grafana
drwxr-xr-x. 2 root         root      6 Feb 11 15:54 influxdb
-rwxrwxrwx. 1 rastreamento docker  116 Feb 17 14:46 start_containers.sh
-rwxrwxrwx. 1 rastreamento docker   20 Feb 22  2019 stop_containers.sh

来自 Grafana 的 ID

[rastreamento@VMINDUS ~]$ docker exec -it 691c907ed1f1 /bin/bash 
grafana@691c907ed1f1:/usr/share/grafana$ id 
uid=472(grafana) gid=472(grafana) groups=472(grafana)

为了进行测试,我启动了 Grafana docker 将用户映射到 root 和目录/home/grafana,如下所示:

[rastreamento@VMINDUS ~]$ sudo docker run --user 0:0 -p 3000:3000 --volume /home/rastreamento/grafana:/home/grafana/ d0454da13c84

在容器 shell 中,我检查了运行实例的 ID,并尝试列出/home/grafana 目录中的文件

grafana@2263170898d0:/var/lib$ [rastreamento@VMINDUS ~]$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED    STATUS              PORTS                    NAMES 
345145c9a591        d0454da13c84        "/run.sh"           7 seconds ago       Up 4 seconds        0.0.0.0:3000->3000/tcp   heuristic_wescoff 
[rastreamento@VMINDUS ~]$ docker exec -it 345145c9a591 /bin/bash
root@345145c9a591:/usr/share/grafana# cd /home/grafana/ 
root@345145c9a591:/home/grafana# ls 
ls: cannot open directory '.': Permission denied 
root@345145c9a591:/home/grafana# id 
uid=0(root) gid=0(root) groups=0(root)

如您所见,用户和组 ID 似乎已更改,正如容器启动时应有的那样,但即使如此,我仍无法访问主机映射目录。

仍然不知道为什么它在 Ubuntu 上工作但在 CentOs 上不行。我从未使用过CentOs,是否有任何其他配置可以使应用程序访问主机资源?一些安全配置?我真的很难受。

最佳答案

由 Avi Farada 在 this post 中指定,添加卷绑定(bind)解决了我的问题。

:z - 将使用标签“svirt_sandbox_file_t”向所有容器添加权限 :Z - 仅向当前容器标签添加权限

只需添加到 docker run ':z' 即可,如下所示:

docker run -v ./api:/usr/src/app:Z

或者就我而言,在docker-composer中:

volumes:
   - ./api:/usr/src/app:Z

有关此的更多信息请检查 docker official documentation .

Jan Garaj 提出了另一个聪明的建议,两台机器之间的不同行为可能是由于版本不匹配造成的。我使用 CentOS 包管理器来安装 docker,而另一方面,在 Ubuntu 上我从官方存储库下载了最新版本。

[编辑]

我使用了 CentOS 软件包存储库中的 Docker。那已经完全过时了!!!

在 Docker 官方安装指南中,他们做的第一件事就是卸载机器上的原生 docker,以防你也做了和我一样的蠢事。

只需按照以下说明安装 Docker:

https://docs.docker.com/engine/install/centos/

关于linux - Docker容器无法从主机访问映射目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60175493/

相关文章:

node.js - Karma 无法捕获 PhantomJS

linux - pm2 意外下降 - "Error: ENOSPC, write "

linux - Aws Ec2 Amazon Linux 上反复出现数据库连接错误

postgresql - 如何使用Netcat查看postgresql docker容器是否启动

docker-pr proc 已经在监听端口 80?在 Ubuntu 上使用 snappy 安装 docker

command-line - 在 CentOS 上 systemctl restart httpd 后运行一些额外的命令

linux - 删除字符串直到某个字符第一次出现

linux - 如何启动多个 xterm 窗口并在每个窗口上运行一个命令,然后让每个窗口都打开?

linux - mxe 交叉编译 linux 到 windows vtk 示例

python - 在 Dockerfile 中从源代码安装 python 包