You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker自定义用户遇[Errno 13]权限拒绝,如何动态创建目录?

解决方案

方案1:挂载宿主机目录并匹配权限

如果输出目录需要映射到宿主机,优先采用这种安全方式:

  • 先获取容器内myuser的UID:
    docker run --rm ${IMG_TAG} id -u myuser
    
    假设返回UID为1001
  • 宿主机创建目标目录并修改权限:
    mkdir -p /宿主机目标路径
    chown 1001:1001 /宿主机目标路径
    
  • 运行容器时挂载该目录:
    docker run --rm -it -v /宿主机目标路径:/output ${IMG_TAG} python myfile.py --output-path /output
    
    容器内myuser对挂载的/output目录拥有完整权限,可正常创建子目录。

方案2:用入口脚本临时提权创建目录

如果必须在容器内部创建任意路径(非挂载目录),可以通过入口脚本实现:

  1. 修改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"]
    
  2. 创建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 "$@"
    
  3. 重新构建镜像后,运行命令:
    docker run --rm -it ${IMG_TAG} --output-path /output
    

方案3:限制输出到用户有权限的目录

最轻量化的方式是让输出路径落在myuser的工作目录下:

  • 让用户传入相对路径,比如:
    python myfile.py --output-path ./output
    
    目录会创建在/home/myuser/output,myuser拥有完整权限,无需额外配置。

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:01:44