使用Docker自定义用户遇[Errno 13]权限拒绝,如何动态创建目录?
解决方案
方案1:挂载宿主机目录并匹配权限
如果输出目录需要映射到宿主机,优先采用这种安全方式:
- 先获取容器内
myuser的UID:
假设返回UID为docker run --rm ${IMG_TAG} id -u myuser1001 - 宿主机创建目标目录并修改权限:
mkdir -p /宿主机目标路径 chown 1001:1001 /宿主机目标路径 - 运行容器时挂载该目录:
容器内docker run --rm -it -v /宿主机目标路径:/output ${IMG_TAG} python myfile.py --output-path /outputmyuser对挂载的/output目录拥有完整权限,可正常创建子目录。
方案2:用入口脚本临时提权创建目录
如果必须在容器内部创建任意路径(非挂载目录),可以通过入口脚本实现:
- 修改Dockerfile,添加sudo并配置免密权限:
FROM path-to-internal-images/python:3.8 RUN adduser --system myuser # 安装sudo并允许myuser免密执行mkdir和chown RUN apt-get update && apt-get install -y sudo \ && echo "myuser ALL=(ALL) NOPASSWD: /usr/bin/mkdir, /usr/bin/chown" >> /etc/sudoers.d/myuser WORKDIR /home/myuser COPY requirements.txt . RUN pip install -i https://myendpoint/api/pypi/pypi-abc/simple -r requirements.txt COPY myfile.py entrypoint.sh . RUN chmod +x entrypoint.sh USER myuser ENTRYPOINT ["./entrypoint.sh"] - 创建
entrypoint.sh脚本:#!/bin/bash # 解析--output-path参数 OUTPUT_PATH="" PREV_ARG="" for ARG in "$@"; do if [[ "$PREV_ARG" == "--output-path" ]]; then OUTPUT_PATH="$ARG" elif [[ "$ARG" == --output-path=* ]]; then OUTPUT_PATH="${ARG#*=}" fi PREV_ARG="$ARG" done # 若指定了输出路径,先提权创建并修改权限 if [[ -n "$OUTPUT_PATH" ]]; then sudo mkdir -p "$OUTPUT_PATH" sudo chown myuser:myuser "$OUTPUT_PATH" fi # 执行原Python脚本 python myfile.py "$@" - 重新构建镜像后,运行命令:
docker run --rm -it ${IMG_TAG} --output-path /output
方案3:限制输出到用户有权限的目录
最轻量化的方式是让输出路径落在myuser的工作目录下:
- 让用户传入相对路径,比如:
目录会创建在python myfile.py --output-path ./output/home/myuser/output,myuser拥有完整权限,无需额外配置。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

