Dockerfile入口点

我正在尝试自定义以下存储库中显示的Docker镜像https://github.com/erkules/codership-images

我在Dockerfile中创build了一个cron作业,并试图用CMD运行它,知道erkules图像的Dockerfile有一个ENTRYPOINT ["/entrypoint.sh"] 。 它没有工作。

我尝试创build一个单独的cron-entrypoint.sh并将其添加到dockerfile中,然后testing像这样的ENTRYPOINT ["/entrypoint.sh", "/cron-entrypoint.sh"] 。 但也得到一个错误。

我尝试将cron作业添加到erkules图像的entrypoint.sh中,当我把它放在开头时,容器运行cron作业,但不执行其他的entrypoint.sh。 而当我把cron脚本放在entrypoint.sh的末尾时,cron作业不能运行,但是entrypoint.sh中的任何东西都会被执行。

我怎么能够通过Dockerfile同时运行erkules image的entrypoint.sh和我的cron作业?

您需要将cron命令发送到后台,所以要么使用&或者删除-f-f means: Stay in foreground mode, don't daemonize.

所以,在你的entrypoint.sh中:

 #!/bin/bash cron -f & ( # the other commands here ) 

编辑:我完全同意@BMitch关于你应该处理多个进程的方式,但在同一个容器内,这是不推荐的东西。

看到这里的例子: https : //docs.docker.com/engine/admin/multi-service_container/

首先要看的是你是否需要在同一个容器中运行多个应用程序。 理想情况下,容器只能运行一个应用程序。 您可以为不同的应用程序运行多个容器,并将它们连接在一起使用相同的networking或共享音量以实现您的目标。

假设你的devise需要在同一个容器中的多个应用程序,你可以在后台启动一些,并在前台运行最后一个。 不过,我会倾向于使用pipe理多个进程的工具。 我能想到的两个工具是我的头顶上的supervisord和工头。 使用像supervisord这样的优点是,它将处理信号以干净地closures应用程序,并且如果一个进程死亡,您可以将其configuration为自动重启该应用程序,或者考虑容器失败和exception终止。