Docker 容器无法从主机访问映射目录
Docker container can't access mapped directory from host
我运行在 CentOS 环境中安装 grafana 和 influxdb 容器,但是当我启动容器时,两者都说无法在映射目录上创建文件。
我在 Ubuntu 上有同样的环境 运行ning,没有遇到任何问题。
我已经将目录更改为 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
这是容器 运行ning 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 在 中分配的那样,添加卷绑定解决了我的问题。
:z - 将使用标签 'svirt_sandbox_file_t' 向所有容器添加权限
:Z - 将仅向当前容器标签添加权限
只需像这样添加到 docker 运行 ':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:
我运行在 CentOS 环境中安装 grafana 和 influxdb 容器,但是当我启动容器时,两者都说无法在映射目录上创建文件。
我在 Ubuntu 上有同样的环境 运行ning,没有遇到任何问题。
我已经将目录更改为 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
这是容器 运行ning 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 在
:z - 将使用标签 'svirt_sandbox_file_t' 向所有容器添加权限 :Z - 将仅向当前容器标签添加权限
只需像这样添加到 docker 运行 ':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: