我有一个带有服务器的基础Docker映像,然后将在该映像的基础上构建以托管特定的应用程序。有没有一种方法可以防止某些文件在下游映像中被覆盖。
例如,假设我有一个Apache Tomcat映像,并且我不希望其他拥有应用程序的人通过在其Dockerfile中运行web.xml
来覆盖ADD myapp/web.xml $CATALINA_HOME/conf
文件。
答案 0 :(得分:2)
这是不可能的。 (典型的Dockerfile以root用户身份执行其大部分工作,如果不这样做,则如果它真的想覆盖该文件,可以轻而易举USER root
。)这似乎也没什么大不了的您所描述的情况是因为Docker映像通常是单一用途的,并且如果在Tomcat映像之上运行的某些特定应用确实要重新配置应用服务器,则Docker的隔离意味着它不会影响其他任何东西。
如果您真的想,可以将文件的副本放在安全的地方,然后在入口点脚本中将其复制回去,但是如果我是下游开发人员,并且遇到了这种情况我可能会感到有点沮丧(这肯定违反了最少惊讶的原则)。
答案 1 :(得分:1)
最终,无论他们的图像基于您的图像,谁都拥有完全控制权,可以覆盖他们想要的任何配置或文件。 Docker并不是为了阻止它而构建的。
也就是说,如果您只是想防止意外覆盖,就有可能解决此问题。
我将ENTRYPOINT链接为您自己的脚本,该脚本反过来启动您的服务器。但在此之前,它会验证一堆组件的完整性,例如server.xml端口和连接器,web.xml等。它可以像生成验证签名并将其提交给集群验证程序一样复杂。例如。如果您在Kubernetes中运行,则可以有一个协调器来列出并验证所有正在运行的容器,并且可以验证此类签名并阻止所有不符合要求的标准。
即您的问题应该引起运行时环境的注意,而不是图像级别,在运行时环境中,您需要确保任务的安全,在该环境中,您应该尽可能地提高灵活性,以支持将来的开发。