如何在Docker容器内获取volume对应的宿主机挂载目录名且无需额外传参?
解决方案
你当前通过排除系统目录匹配挂载路径的方案容错率较低,若用户自定义的挂载目录名刚好命中排除列表,就会出现匹配失败的问题。以下提供两种无需修改容器启动命令、无需额外传参的可靠实现方案:
方案一:构建阶段预存根目录默认列表,启动时对比匹配
该方案准确率最高,不会受到挂载文件系统类型的影响:
- 改造Dockerfile的构建逻辑,在安装依赖的RUN命令最后,将镜像默认的根目录列表写入文件持久化:
RUN apt-get update && \ apt-get upgrade -y && \ apt-get install --no-install-recommends gcc=4:10.2.1-1 luarocks=2.4.2+dfsg-1.1 -y && \ rm -rf /var/lib/apt/lists/* && \ luarocks install luacheck && \ # 预存构建阶段根目录下的所有默认目录列表 ls -d /*/ > /root/.default_root_dirs
- 修改CMD的路径匹配逻辑,通过对比当前根目录列表和预存列表,筛选出用户新增的挂载目录:
CMD PROJECT_DIRECTORY=$(comm -13 <(sort /root/.default_root_dirs) <(sort <(ls -d /*/))) && \ cd "$PROJECT_DIRECTORY" && \ stylua ./**/*.lua && \ lua-format -i ./**/*.lua && \ luacheck ./**/*.lua && \ selene ./**/*.lua
方案二:直接从系统挂载信息中筛选挂载点
无需修改构建逻辑,直接通过读取系统挂载记录筛选用户挂载的项目目录,适合不想改动构建流程的场景,直接将CMD修改为如下逻辑即可:
CMD # 排除系统默认挂载类型,筛选出用户手动挂载的目录 PROJECT_DIRECTORY=$(findmnt -n -o TARGET --types notmpfs,nosysfs,noproc,nodevtmpfs,nooverlay | grep -v "^/$" | head -n 1) && \ cd "$PROJECT_DIRECTORY" && \ stylua ./**/*.lua && \ lua-format -i ./**/*.lua && \ luacheck ./**/*.lua && \ selene ./**/*.lua
注意事项
两种方案都默认用户仅挂载一个项目目录,如果你需要支持同时挂载多个目录做检查,可以将匹配到的路径放到循环中批量执行检查逻辑即可。
内容的提问来源于stack exchange,提问作者henriquehbr
相关产品推荐
相关产品推荐

