docker - 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
有什么想法为什么会出现权限问题?有关了解容器以了解发生了什么的任何指导?
解决方案
在 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 写入根目录和数据目录
推荐阅读
- php - 如何在三元运算符中使用 if 和 endif 语句?
- javascript - 运行javascript服务器时html页面未加载
- java - 活动未在 android 9 中启动,但在较低版本的 android 中运行良好
- firefox-developer-tools - 在 Firefox 中禁用触摸模拟会以不同方式呈现 HTML/CSS
- sql - SQL Server 过程或函数 CreateTable 指定的参数过多
- c# - 如何将自定义子目录与 Visual Studio 中的根命名空间匹配
- apache-camel - 如何在骆驼中为 to() 方法编写计时器
- c# - 循环和数组
- php - PDOException:在第 3 行的 C:\wamp64\www\Fireblock\index.php 中
- r - 导出到 excel 之前数据框的颜色列表