如何用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
相关产品推荐
相关产品推荐

