openjdk:8-jre-alpine :- 使用 docker 和 cron 定期执行 jar 文件

openjdk:8-jre-alpine :- Execute a jar file periodically using docker with cron

我想使用带有 cron(定期执行任务)的 alpine(因为它创建一个轻量级图像)创建一个 docker 文件,作为一个新手,我最初尝试使用 ubuntu当我从这个 link UbuntuExample with CRON

中得到帮助时,它工作得很好

现在的问题是它创建了沉重的 docker 图像。我想为高山转换这个相同的例子,但找不到完美的帮助。找了很多网站都没有什么收获。

主要任务:-

我的主要任务是通过docker执行一个javajar文件,并定期执行那个jar文件

到目前为止,我一直在尝试创建一个简单的 docker 文件和一个 crontab 文件,以便定期打印消息。

我面临的主要问题是在 alpine 上安装 cron。

DOCKERFILE (Docker文件)

   FROM ubuntu:latest
MAINTAINER docker@ekito.fr

# Add crontab file in the cron directory
ADD crontab /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

#Install Cron
RUN apt-get update
RUN apt-get -y install cron


# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

CRONTAB(定时任务)

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required to run the cron job

这对 ubuntu 非常有效,但如何实现 openjdk:8-jre-alpine

openjdk:8-jre-alpine 图片库示例:

Docker 文件:

FROM openjdk:8-jre-alpine
MAINTAINER dperezcabrera

ADD java-version-cron /temp/java-version-cron

RUN cat /temp/java-version-cron >> /etc/crontabs/root
RUN rm /temp/java-version-cron

RUN touch /var/log/cron.log

CMD crond 2>&1  >/dev/null && tail -f /var/log/cron.log

脚本java-version-cron:

*       *       *       *       *       /usr/bin/java -version >>/var/log/cron.log  2>&1

终于完成了使用 cron 执行 java jar 的任务。发布解决方案,以便它可以帮助其他初学者。

Dockerfile

FROM openjdk:8-jre-alpine
MAINTAINER dperezcabrera

RUN apk update && apk add bash
ADD java-version-cron /temp/java-version-cron
RUN chmod 777 /etc/test/
ADD DockerTesting-0.0.1-SNAPSHOT.jar /etc/test
RUN cat /temp/java-version-cron >> /etc/crontabs/root
RUN rm /temp/java-version-cron

RUN touch /var/log/cron.log

CMD crond 2>&1  >/dev/null && tail -f /var/log/cron.log

java-version-cron

* * * * * java -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required to run the cron job

将您的 dockerfile 、cron 和 jar 放在同一个文件夹中或根据您的要求放置。

# https://labs.play-with-docker.com/
# add this to dockerfile and execute below two docker commands
# docker build -t cron:test .
# docker run cron:test &

FROM openjdk:8-jdk-alpine

RUN mkdir /app
RUN mkdir /app/bin
RUN mkdir /app/lib
RUN mkdir /app/crontabs

RUN wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox_CROND
RUN mv busybox_CROND /app/bin/crond
RUN wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox_CRONTAB
RUN mv busybox_CRONTAB /app/bin/crontab
RUN chmod +x /app/bin/*

# create HelloWorld.java and compile on the fly, cannot upload files to docker labs
RUN echo 'public class HelloWorld { public static void main(String[]args){ System.out.println("Hello World ..." + new java.util.Date()); } }' > /app/lib/HelloWorld.java
RUN javac /app/lib/HelloWorld.java -d /app/lib

# create entry point script on the fly to avoid windows line ending issues
RUN touch /entrypoint.sh
RUN echo '#!/bin/sh' >> /entrypoint.sh
RUN echo 'echo "* * * * * java -cp /app/lib HelloWorld" | crontab -c /app/crontabs -' >> /entrypoint.sh
RUN echo 'crontab -c /app/crontabs -l' >> /entrypoint.sh
RUN echo 'echo "Executing crond ..."'  >> /entrypoint.sh
# -f foreground flag is important, if this returns, docker exits
RUN echo 'crond -f -l 6 -c /app/crontabs' >> /entrypoint.sh 
RUN echo 'echo "crond exited !!!"'  >> /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT /entrypoint.sh