Dockerfile入口点

时间:2017-06-12 20:29:53

标签: docker cron containers sh dockerfile

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

我在Dockerfile中创建了一个cron作业,并尝试使用CMD运行它,因为知道erkules图像的Dockerfile有一个ENTRYPOINT ["/entrypoint.sh"]。它不起作用。

我尝试创建一个单独的cron-entrypoint.sh并将其添加到dockerfile中,然后测试类似ENTRYPOINT ["/entrypoint.sh", "/cron-entrypoint.sh"]的内容。但也会出错。

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

如何通过Dockerfile同时运行erkules图像的entrypoint.sh和我的cron作业中的内容?

2 个答案:

答案 0 :(得分:0)

您需要将cron命令发送到后台,因此请使用-f或移除-f means: Stay in foreground mode, don't daemonize.#!/bin/bash cron -f & ( # the other commands here )

所以,在你的entrypoint.sh中:

library(xts)

Sys.setenv(TZ='GMT')

df <- read.table(sep = ",", header = TRUE, stringsAsFactors = FALSE, text = '
  Period.Start.Time,DO0182U09A3,DO0182U09B3,DO0182U09C3,DO0182U21A1,DO0182U21A2,DO0182U21A3\n
  "2017-01-20 16:30:00",-101.50,-103.37,-103.86,-104.78,-104.95,-105.3\n
  "2017-01-20 16:45:00",-101.32,-102.75,-104.22,-104.51,-103.94,-105.29\n
  "2017-01-20 17:00:00",-101.45,-103.30,-103.93,-104.70,-104.82,-105.13\n
  "2017-01-20 17:15:00",-100.91,-95.92,-99.22,-103.83,-104.72,-105.19\n
  "2017-01-20 17:30:00",-100.91,-103.04,-104.09,-102.15,-104.91,-105.18\n
  "2017-01-20 17:45:00",-100.97,-103.67,-104.12,-105.07,-104.23,-97.48
')

df2 <- xts(x = df[,-1], order.by = as.POSIXct(df[,1]))

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

请参阅此处的示例:https://docs.docker.com/engine/admin/multi-service_container/

答案 1 :(得分:0)

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

假设您的设计需要在同一个容器中安装多个应用,您可以在后台启动一些应用并在前台运行最后一个应用。但是,我倾向于使用管理多个进程的工具。我能想到的两个工具是监督和工头。使用像supervisord这样的东西的好处是,它会处理信号以干净地关闭应用程序,如果一个进程死掉,你可以将其配置为自动重启该应用程序或考虑容器失败并异常终止。