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

无法让AWS Glue镜像的glue_user写入Docker卷的问题求助

解决AWS Glue容器中glue_user无法写入挂载卷的权限问题

问题描述

在WSL2的Ubuntu环境中,通过docker-compose配置AWS Glue官方镜像与LocalStack开展本地测试,已将Git仓库根目录挂载到容器的/home/glue_user/workspace目录。但容器内的glue_user始终无法获得该挂载卷的写入权限,使用root用户则可正常生成测试覆盖率报告。出于安全性考虑,希望保留glue_user身份运行测试,而非切换到root。

运行测试的命令:

docker compose run --build --rm glue-environment "python3 -m pytest -p no:cacheprovider --cov=aws_glue --cov-report=html"

当前报错:

INTERNALERROR> coverage.exceptions.DataError: Couldn't use data file '/home/glue_user/workspace/.coverage.7e6e9c929f2d.1.XNeZfvkx': unable to open database file

已尝试的方案:

  • 在Dockerfile中通过chown、chmod赋予glue_user权限
  • 修改WSL的/etc/wsl.conf配置
  • 更换工作目录
  • 在GitHub Action环境测试,问题依旧

解决方案

方案1:在docker-compose中指定匹配宿主的UID/GID

AWS Glue镜像的glue_user默认UID为1000、GID为1000(可通过docker run --rm amazon/aws-glue-libs:glue_libs_4.0.0_image_01 id glue_user确认)。若宿主WSL用户的UID/GID与该值不匹配,会导致挂载卷权限冲突。

在docker-compose.yml中添加user字段,直接指定宿主的UID和GID:

services:
  glue-environment:
    build: .
    user: "${UID}:${GID}"
    volumes:
      - ./:/home/glue_user/workspace
    # 其他原有配置...

运行前确保环境变量生效,WSL中可直接执行:

export UID=$(id -u) GID=$(id -g)

方案2:在Dockerfile中调整glue_user的UID/GID匹配宿主

若不想每次运行都传递环境变量,可在Dockerfile中修改glue_user的UID/GID,与宿主用户保持一致:

FROM amazon/aws-glue-libs:glue_libs_4.0.0_image_01

# 通过构建参数传入宿主的UID/GID
ARG HOST_UID=1000
ARG HOST_GID=1000

# 修改glue_user的UID和所属组GID
RUN usermod -u ${HOST_UID} glue_user && groupmod -g ${HOST_GID} glue_user

# 确保挂载目录权限适配修改后的用户
RUN chown -R glue_user:glue_user /home/glue_user/workspace

USER glue_user

在docker-compose.yml中传递构建参数:

services:
  glue-environment:
    build:
      context: .
      args:
        HOST_UID: ${UID}
        HOST_GID: ${GID}
    volumes:
      - ./:/home/glue_user/workspace
    # 其他原有配置...

方案3:将coverage报告写入容器内非挂载目录后复制

若不想调整用户权限,可指定coverage输出到容器内的非挂载路径(如/tmp/coverage),测试完成后再将报告复制到宿主:

修改测试命令:

docker compose run --build --rm glue-environment "python3 -m pytest -p no:cacheprovider --cov=aws_glue --cov-report=html:/tmp/coverage/html"

复制报告到宿主(注意:若使用--rm参数,容器运行后会被删除,需去掉该参数或后台运行容器后再执行复制):

docker cp $(docker compose ps -q glue-environment):/tmp/coverage/html ./coverage-report

验证方法

执行以下命令,确认glue_user身份正常且拥有挂载目录的写入权限:

docker compose run --build --rm glue-environment "id && touch /home/glue_user/workspace/test-permission && ls -la /home/glue_user/workspace/test-permission"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:55:56