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

如何用Python脚本从Docker容器向Docker Volume写入文件

问题:Docker命名卷权限导致Python脚本无法写入文件

我有一个Python脚本,尝试执行open("util/file.json", 'w')时遇到了针对"util/file.json"的PermissionError。脚本在Docker Compose管理的容器内运行,我想用命名卷持久化file.json,而非绑定主机目录(后者改权限后可行,但命名卷能让容器在其他机器上运行,更符合需求)。作为Docker新手,我肯定漏了些关键点,求帮忙解决。

当前Dockerfile片段

WORKDIR /app

ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "/nonexistent" \
    --shell "/sbin/nologin" \
    --no-create-home \
    --uid "${UID}" \
    appuser

COPY . .

# This was an attempt to give proper permissions, didn't work
USER root
RUN mkdir -p /util \
 && chown -R appuser /util

# Switch to the non-privileged user to run the application.
USER appuser

# Run the application.
CMD python3 bot.py

当前compose.yaml

version: "1.0.0"
services:
  app:
    build: .
    user: appuser
    container_name: name
    volumes: 
      - some_util:/app/util

volumes: 
  some_util: 

解决方案

1. 修正Dockerfile中的目录路径错误

你在Dockerfile中创建并授权的是/util目录,但脚本实际要写入的是/app/util(因为WORKDIR设为/app,脚本里的相对路径util对应容器内的/app/util)。命名卷挂载到/app/util后,容器启动时会自动创建该目录,但默认所属用户是root,导致appuser无写入权限。

修改Dockerfile中创建目录的命令:

USER root
RUN mkdir -p /app/util \
    && chown -R appuser:appuser /app/util
USER appuser

重新构建镜像即可。

2. 修复已存在的命名卷权限(如果之前已经创建过卷)

如果some_util命名卷已经存在,里面的目录权限还是root,可以通过临时容器修正:

docker run --rm -v some_util:/tmp/util alpine chown -R 10001:10001 /tmp/util

这里的10001要和Dockerfile中ARG定义的UID保持一致,执行后重启应用容器即可。

3. 确认compose.yaml挂载路径正确

你的compose.yaml中some_util:/app/util的挂载路径是正确的,和脚本中的相对路径匹配,无需修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:03:33