无法让AWS Glue镜像的glue_user写入Docker卷的问题求助
问题描述
在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

