在容器内编译代码后,文件在容器外出现不可修改,无法 source 的问题。
文件不可修改的问题,容器内编译后的文件在外部显示是上锁的
上锁是因为进入容器内的用户与容器外的用户权限不同,导致的无法修改,一般进容器后的用户 id 是 root 的用户,权限高于容器外普通用户。
解决的方法一种是在容器外切换到 root 用户,另一种方法是以当前用户 id 进入到容器
docker run 有一个 --user 参数可以选择进入到容器内的用户 id,参数 $(id -u):$(id -g) 表示当前用户和当前用户相同权限
docker run -it --user $(id -u):$(id -g) jjucat/nav:gui
进容器后用户名时候会提示 "I have no name!"
这是因为在容器内没有宿主机的用户信息,需要把宿主机用户信息映射到容器中去。ubuntu20 中用户信息在 "/etc/passwd" 文件中,通过 "-v 宿主机路径:容器路径" 参数把路径映射到容器中即可。
docker run -it --user $(id -u):$(id -g) -v /etc/passwd:/etc/passwd jjucat/nav:gui
成功以当前用户 id 进入到容器 !
无法 source 文件的问题是因为工作目录映射到容器中的路径和在宿主机中的路径不同导致的,只要同步路径就可以了。
例如工作目录在宿主机中是 "/home/lmr/ws/nav/proj1_ws"
docker run -it -v /home/lmr/ws/nav/proj1_ws:/home/lmr/ws/nav/proj1_ws jjucat/nav:gui
-------------------- 分割线 20240421 --------------------
参考
groups:can't find name for group id 问题解决
上面进入容器前只映射用户信息的话,在容器内会有如下的提示:
docker groups cannot find name for group id
这是因为缺少组信息,ubuntu 中用户信息和用户组信息是分别保存在 /etc/passwd 和 /etc/group 目录下,所以两个路径最好都映射进容器中。
docker run -it --user $(id -u):$(id -g) -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group jjucat/nav:gui
进入 docker 后没有 group 的错误提示了。