【Docker】解决容器运行过程中产物用户权限问题

容器内的用户通常是 root(UID 0),而宿主机可能是一个普通用户(如 UID 1000)。所以当 root 用户在容器内写入文件时,这些文件在宿主机看来是 root 拥有的,你的宿主用户没有权限直接修改或删除,就表现为“被锁住”。

比如想用 ros 的基础镜像来编译一个工作空间,编译结束后,发现宿主机中无法直接操作 build 和 devel。需要手动更改权限。

假如有三个文件

.
├── build.sh
├── docker-compose.yml
└── src

其中,src 是空文件夹,当然也可以包含功能包源码,build.sh 内容

#!/bin/bash

echo "UID=$(id -u)" > .env
echo "GID=$(id -g)" >> .env

docker-compose up

docker-compose.yml 内容

services:
  ros_builder:
    image: osrf/ros:noetic-desktop-full-focal
    container_name: ros_builder
    user: "${UID}:${GID}"
    working_dir: /workspace
    volumes:
      - ./:/workspace
    command: /bin/bash -c "source /opt/ros/noetic/setup.bash && catkin_make"

编译工作空间

./build.sh

发现 build 和 devel 文件夹和其中文件不在是上锁的状态了。

这等同于命令行直接执行

docker run --rm -u $(id -u):$(id -g) \
  -v $(pwd):/workspace \
  -w /workspace \
  osrf/ros:noetic-desktop-full-focal \
  bash -c "source /opt/ros/noetic/setup.bash && catkin_make"
上一篇