我有以下Dockerfile
:
FROM gitlab-registry.foo.ru/project/my_project
FROM aerospike/aerospike-server
在第一个和第二个之上有一个ENTRYPOINT
。
众所周知,只会执行一个ENTRYPOINT
。是否存在运行所有父项ENTRYPOINT
的方法?
是否正确,我可以使用Docker-Compose
执行此类任务?
答案 0 :(得分:1)
简单的答案是否。
您的Dockerfile使用Docker Multi-Stage builds,用于将依赖项从一个映像传输到另一个映像。最后一个FROM
语句是结果图像的基本图像。
基础图像的入口点只会被继承。如果您想要与来自上一个FROM
指令的基本映像中指定的值不同,则需要设置exlicilty设置入口点。
答案 1 :(得分:1)
从上面的评论中,对Docker正在做的事情存在根本性的误解。容器是一个孤立的过程。当您启动docker容器时,它会为您的应用程序启动一个进程,当该进程退出时,容器将退出。一个好的最佳实践是每个容器一个应用程序。尽管有多种方法可以启动多个程序,但我不推荐它们,因为它会使运行状况检查,升级,信号处理,日志记录和故障检测变得复杂。
没有干净的方法将多个图像合并在一起。在您列出的Dockerfile中,您定义了一个多阶段构建,可用于将文件从第一阶段复制到最终阶段。生成的图像将是最后一个FROM
部分,而不是两个图像的合并。多阶段构建的典型用法是替换单独的编译映像或外部构建过程,并使用包含编译映像的单个命令和在运行时映像内输出应用程序的运行时映像。这与您正在寻找的内容截然不同。
在docker中运行多个应用程序的首选方法是来自不同映像的多个容器,并使用docker网络将它们连接在一起。您希望以docker-compose.yml开头,docker-compose
可以在独立的docker引擎上使用docker stack deploy
,也可以使用case class
来使用swarm模式的功能。