我想在弹性搜索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文件并执行容器后,我得到了
在此步骤中放置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"
}
}
}
}'
答案 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可能有点小。尽管如此,您仍需要采取的基本方法如下:
cron
和curl
的Docker映像–没有Elasticsearch,没有实际的crontab,仅包含程序本身。docker run
设置容器,请docker network create some_network
(使用任何名称和默认选项),并使用--net some_network
来运行Elasticsearch和cron容器。curl
命令中,使用Elasticsearch容器的docker run --name
或其Docker Compose services:
块的名称作为主机名; localhost
始终表示“此容器”。docker run -v
选项将它们注入cron容器(即,将它们视为配置)。