譬如:
docker run -d -v /path/web:/var/www nginx_name
就会出现 volume 权限问题,而 Dockerfile 中的
RUN chown -R nobody:nobody /path
则仅仅在构建的时候生效,或者说,在 -v 挂载 volume 后,就无效了,/path 的权限变为 host 的目录权限。
最恼人的是,各发行版 nobody 、 nginx 等的 UID GID 是不同的数字。就是说,我不能在 ENTRYPOINT 中通过 chown -R nobody:nobody
来解决。
网上搜索了一圈,发现一个 ENTRYPOINT 脚本,
TARGET_GID=$(stat -c "%g" /volume/FOOBAR)
EXISTS=$(cat /etc/group | grep $TARGET_GID | wc -l)
# Create new group using target GID and add nobody user
if [ $EXISTS == "0" ]; then
groupadd -g $TARGET_GID tempgroup
usermod -a -G tempgroup nobody
else
# GID exists, find group name and add
GROUP=$(getent group $TARGET_GID | cut -d: -f1)
usermod -a -G $GROUP nobody
fi
目的很简单,检查挂载 volume 的 GID ,如果不存在,则新建个相同 GID 的 tempgroup ,再加个用户到 tempgroup ;如果 GID 存在,则将 nobody 添加到该 GID 组中。
只不过容器构建的时候出错,提示 usermod groupadd 等命令找不到。况且,该脚本的逻辑本身存在问题,譬如如果 GID 99 能匹配到 GID 999 。
我现在是暴力的在 docker run 中直接运行 chown 命令
大家又是如何优雅的解决这个问题的?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.