docker - Docker写权限被拒绝
问题描述
我正在尝试使用 docker 运行一个简单的命令,该命令读取我的主目录中的文件并将输出文件写入本地机器(/home/userxyz/projects/data
)上的同一目录中。该data
文件夹属于我 ( userxyz
) 和我的具有相同名称 ( userxyz
) 且具有 R/W 权限的组。
我用这样的 Dockerfile 构建了一个图像(遵循如何将用户添加到 Docker 容器?):
FROM osgeo/gdal:alpine-small-latest
RUN mkdir /usr/tmp
RUN addgroup -S userxyz \
&& adduser -S -D -h /usr/tmp userxyz userxyz \
&& chown -R userxyz:userxyz /usr/tmp
USER userxyz
WORKDIR /usr/tmp
和:
docker build -t userxyz/test .
我用以下方式运行docker:
docker run --rm -v /home/userxyz/projects/data:/usr/tmp userxyz/test gdal_translate -ot UInt32 /usr/tmp/input.tif /usr/tmp/output.tif
但是,我仍然得到:
ERROR 4: Attempt to create new tiff file `/usr/tmp/output.tif' failed: Permission denied
当我只读取文件时它可以工作:
docker run --rm -v /home/userxyz/projects/data:/usr/tmp userxyz/test gdalinfo /usr/tmp/input.tif
知道写入权限有什么问题吗?
编辑:当打开数据文件夹以读取/写入“其他”时,文件是由正确创建的user#500100
,所以我猜它是用户名归属的东西?我该怎么做才能使文件由userxyz
而不是由创建user#500100
?
解决方案
尽管您在 Dockerfile 中设置了相同的用户和组userxyz:userxyz
,但主机 rootfs 和容器 rootfs 是 2 个不同的 rootfs。这意味着相同用户名/组名的UID
&GID
仍然不同。
结果,仅仅复制username
,groupname
是不够的,你还需要复制UID
, GID
,类似下一个:
Dockerfile:
FROM ubuntu:16.04
ARG UID
ARG GID
RUN groupadd -g $GID userxyz
RUN useradd -m -u $UID -g $GID -s /bin/bash userxyz
构建命令:
docker build -t abc:1 --build-arg UID=`id userxyz -u` --build-arg GID=`id userxyz -g` .
解释:
id userxyz -u
&id userxyz -g
获取主机上的 UID/GID,并将它们传递给构建容器,然后docker build
使用它们设置与主机相同的 UID/GID userxyz
。这将确保在容器中您与主机具有相同的权限。
推荐阅读
- apache-spark - 从 Spark 结构化流作业写入时的增量表版本控制
- java - Java File Watcher 无法识别文件更改
- sql - 如何向所有在餐厅举行多次会议的客户展示
- php - 从数组打印 Html 表格
- tensorflow - 导入 TensorFlow Probability 的问题
- windows - Go SDK更新修改默认安装路径
- php - 从选择下拉列表中选择随机选项
- sql - 如何从 Oracle 时间戳值中仅提取时间分量?
- javascript - 我如何让 Magit 与 Commitizen 合作?
- java - 在 Java 中将 DefaultListModel 转换为 List