容器内的用户通常是 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"