首页 > 解决方案 > Docker 容器中的目录权限似乎在 MacOS 和 Ubuntu 之间有所不同

问题描述

当主机是 MacOS 时,这个 docker-compose 片段可以正常工作,但当主机是 Ubuntu 时会失败:

version: '3.3'

services:
  cassandra1:
    image: cassandra:3.5
    container_name: cassandra1
    restart: always
    environment:
      JVM_EXTRA_OPTS: -Dcassandra.config=/home/cassandra/cassandra.yaml
    volumes:
      - ./root/cassandra/keystore:/home/cassandra/conf/.keystore:ro
      - ./root/cassandra/keystore:/home/cassandra/conf/.truststore:ro
      - ./root/cassandra/cassandra.yaml:/home/cassandra/cassandra.yaml:ro
      - ./root/cassandra/cassandra-rackdc.properties:/home/cassandra/cassandra-rackdc.properties:ro
      - ./data/cassandra1/data:/home/cassandra/data
      - ./data/cassandra1/commitlog:/home/cassandra/commitlog
      - ./data/cassandra1/saved_caches:/home/cassandra/saved_caches
      - ./data/cassandra1/hints:/home/cassandra/hints

卡桑德拉抱怨:

cassandra1    | ERROR 04:19:55 Doesn't have write permissions for /home/cassandra/data directory
cassandra1    | ERROR 04:19:55 Insufficient permissions on directory /home/cassandra/data

使用 docker exec 无法连接,因此无法查看容器进行诊断:

>docker exec -it 771 bash
Error response from daemon: Container 
7714bb1959eb814d2fb7479b6f74555d308d2c8951f4ad0f54931ecb23f41893 is restarting, wait until the container is running

有什么想法为什么会出现权限问题?有关了解容器以了解发生了什么的任何指导?

标签: dockerdocker-compose

解决方案


在 cassandra docker 中运行 ps 以发现进程的用户 ID (UID):

~/tmp $ docker exec -it cassandra1 ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
cassand+     1     0 20 07:18 ?        00:00:00 /bin/sh /usr/sbin/cassandra -f
root        40     0  0 07:18 pts/0    00:00:00 ps -ef
cassand+    92     1  0 07:18 ?        00:00:00 java -cp /etc/cassandra:/usr/sha
cassand+    93     1  0 07:18 ?        00:00:00 grep -q Error: Exception thrown 

cassandra 进程 UID 为 cassand+

在 docker /etc/passwd 中找到 UID

~/tmp $ docker exec -it cassandra1 grep cassand /etc/passwd
cassandra:x:999:999::/home/cassandra:/bin/sh

docker 内的 cassandra 进程以 UID 999 运行

现在我们知道根/数据卷中的任何文件都需要由用户 UID 999 拥有,以允许 docker 将文件写入主机的文件系统。

~/tmp $ sudo chown -R 999:999 root data
~/tmp $ sudo chmod -R 755 root data
~/tmp $ ls -la
total 20
drwxrwxr-x  4 ubuntu ubuntu 4096 Dec 24 09:36 .
drwxr-xr-x 84 ubuntu ubuntu 4096 Dec 24 09:36 ..
drwxr-xr-x  3    999    999 4096 Dec 24 09:14 data
-rw-rw-r--  1 ubuntu ubuntu  454 Dec 24 09:36 docker-compose.yml
drwxr-xr-x  2    999    999 4096 Dec 24 09:36 root
~/tmp $ 

有可能在您的 Mac 上,您的默认用户将根目录和数据目录写入启用为 UID 999,而在您的 Linux 上,默认用户无法以用户 UID 999 写入根目录和数据目录


推荐阅读