如何在弹性搜索Docker映像上运行crontab作业

时间:2019-03-13 10:00:55

标签: docker elasticsearch cron

我想在弹性搜索docker映像上运行crontab作业,这是我的docker文件

FROM docker.elastic.co/elasticsearch/elasticsearch:6.6.0

ENV PATH=$PATH:/usr/share/elasticsearch/bin

RUN yum -y update

RUN yum -y install crontabs

RUN echo -e "root\nelasticsearch" > /etc/cron.allow

RUN echo "" >> /etc/cron.allow

RUN chmod -R 644 /etc/cron.d

RUN cat /etc/cron.allow

RUN chown -R elasticsearch /etc/cron.d

RUN chmod -R 755 /etc/cron.d

RUN chown -R elasticsearch /var/spool/cron

RUN chmod -R 744 /var/spool/cron

RUN chown -R elasticsearch /etc/crontab

RUN chmod -R 744 /etc/crontab

RUN chown -R elasticsearch /etc/cron.d

RUN chmod -R 744 /etc/cron.d

COPY ./purge.sh /usr/share/elasticsearch

RUN ls -l /etc/crontab

RUN ls -l /etc/cron.d

RUN touch /usr/share/elasticsearch/cron.log

ADD ./cron /etc/cron.d/cron_test

RUN chmod 0644 /etc/cron.d/cron_test

RUN cd /etc/cron.d && cat cron_test

RUN chown -R elasticsearch /etc/cron.d/cron_test

RUN ls -l /etc/cron.d/cron_test

RUN crontab /etc/cron.d/cron_test

RUN crontab -l

RUN cd /var/spool/cron && ls

USER elasticsearch

ENTRYPOINT elasticsearch

CMD crond start && pgrep cron && tail -f && tail -f /usr/share/elasticsearch/cron.log

EXPOSE 9200 9300

运行此docker文件并执行容器后,我得到了

enter image description here

在此步骤中放置docker文件 运行cd / var / spool / cron && ls

它仅显示root,但是如何在其中获得elasticsearch用户呢?**

我的cron文件在本地显示

*/1 * * * * echo "Hello world" >> /usr/share/elasticsearch/cron.log
*/1 * * * * elasticsearch /usr/share/elasticsearch/purge.sh

我的purge.sh文件

curl -XPOST "http://localhost:9200/hydro_dashboard_index/_delete_by_query" -H 'Content-Type: application/json' -d'
{
"query": {
"range" : {
"query_service_entry_time" : {
"lt" : "now-14d"
}
}
}
}'

1 个答案:

答案 0 :(得分:0)

通常认为在容器中仅运行一个进程是一种更好的做法。由于您要在cron中尝试运行的事情只是向Elasticsearch发出HTTP请求,因此不需要在同一容器中甚至根本不在Docker中运行。

如果主机运行的是带有标准cron守护程序的标准Linux发行版,那么最简单的事情就是将这个purge脚本存放在主机上的某个位置,然后通过主机的cron服务运行它。如果您知道cron和elasticsearch在同一主机上,并且使用-p 9200:9200选项启动容器以发布标准的Elasticsearch HTTP端口,则该脚本应保持不变。

如果绝对所有 必须在Docker上运行,则可能会search Docker Hub for a prebuilt cron image(有几个,尽管看起来没有一个特别积极地维护)。您也许还可以使用busybox image中的最少工具集; its documentation可能有点小。尽管如此,您仍需要采取的基本方法如下:

  • 查找或构建仅包含croncurl的Docker映像–没有Elasticsearch,没有实际的crontab,仅包含程序本身。
  • 如果您要手动docker run设置容器,请docker network create some_network(使用任何名称和默认选项),并使用--net some_network来运行Elasticsearch和cron容器。
  • curl命令中,使用Elasticsearch容器的docker run --name或其Docker Compose services:块的名称作为主机名; localhost始终表示“此容器”。
  • 将crontab和支持脚本放在主机上的某个目录中,并使用docker run -v选项将它们注入cron容器(即,将它们视为配置)。