知识卡片
镜像分层与写时复制
内容
容器镜像由一系列只读层叠加而成,每条构建指令产出一层;改东西不是去改已有层,而是在最上面盖一层新的,下层内容原样不动——这就是写时复制。运行一个容器时会在所有镜像层之上再加一层唯一可写的”容器层”,应用运行期间产生的临时文件都写在这里,但这层是易失的,容器一删就没了。这个只读特性有个直接的安全后果:如果密码或密钥曾经被写进某一层,哪怕后面某一层把它删掉了,这份敏感信息依然原封不动地留在底下那层里,谁都能把镜像拉下来翻出来,所以密钥绝对不能被打进镜像的任何一层,包括看似已经删除的层。发散:这提醒了一个容易被忽略的心智模型——容器镜像的历史是完整保留、不可篡改的,”删除”在这里从来不是真的消失,只是加了一层”看不见”的伪装,这和 Git 历史里删掉的敏感文件依然能从旧 commit 里挖出来是同一个道理。
参考来源
《Cloud Native Spring in Action》第6章《Containerizing Spring Boot》