使用 Docker 执行一个简单的 java 应用程序
Execute a simple java application using Docker
新的 docker 实施,研发后尝试。
要完成的任务 :- 在预定时间(即 5 分钟)后通过写入 CRON 运行 docker。
我写了一个简单的 java 应用程序,它只包含一个 println 语句。我想使用 Docker.
执行项目
我的Dockerfile
:
FROM openjdk:8-jre-alpine
RUN mkdir /etc/test/
RUN chmod 777 /etc/test/
COPY /home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
CMD java -Xmx500M -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
我在 CMD 上执行了这个命令:- sudo docker build Documents/DockerTest
命令处理中:-
Sending build context to Docker daemon 7.159 MB
Step 1/5 : FROM openjdk:8-jre-alpine
---> b1bd879ca9b3
Step 2/5 : RUN mkdir /etc/test/
---> Using cache
---> 4720a4e8fa67
Step 3/5 : RUN chmod 777 /etc/test/
---> Using cache
---> 91426c394ae4
Step 4/5 : COPY /home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
lstat home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar: no such file or directory
这个 Docker 文件到底有什么问题。
问题 2 --
现在,我的 docker 文件已成功执行,并且在 运行 上 docker Image java 应用程序的 println 语句打印在控制台上。
现在,我想在 docker 图像上执行 cron 作业,即在固定时间后 运行 特定 docker。
我通过更多的搜索和尝试将我的 docker 更改为这个:-
CRONTAB 文件:-
*/10 * * * * root java -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar 2>&1
已更新 DOCKER 文件:-
FROM openjdk:8-jre-alpine
RUN mkdir /etc/test/
RUN chmod 777 /etc/test/
ADD crontab /etc/cron
ADD jar/ /etc/test/
RUN chmod 0600 /etc/cron
CMD java -Xmx500M -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
但它不起作用,它只打印语句。
Docker 文件中还有什么我遗漏的吗?
发生这种情况是因为您无法从 build context 外部向 Docker 容器添加任何文件:
Extended description
The docker build command builds Docker images from a Dockerfile and a
“context”. A build’s context is the set of files located in the
specified PATH or URL. The build process can refer to any of the files
in the context. For example, your build can use a COPY instruction to
reference a file in the context.
在您的 Dockerfile
旁边创建一个名为 jars
的目录,例如,放入您的 jar 文件,然后:
ADD jars/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
或者您可以简单地从那里复制所有 jar:
ADD jars/ /etc/test/
这样你最终会得到一个里面有 /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
的容器。无论如何,将可执行文件放在 /etc
目录中有什么原因吗?我的意思是这会起作用,但人们希望只有系统配置文件。更合适的位置是 /var
或 /usr/share
,甚至 /app
;)
这是我从 fastapi Docker 容器(源于 tiangolo/uvicorn-gunicorn:python3.8
)运行 Java 的解决方案:
FROM tiangolo/uvicorn-gunicorn:python3.8
LABEL version="1.0"
LABEL description="Install any package using SDKMan"
ENV SDKMAN_DIR /root/.sdkman
# ENV GRAILS_VERSION 3.3.9
ENV JAVA_VERSION 8.0.282-open
RUN apt-get update && apt-get install -y zip curl
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN curl -s "https://get.sdkman.io" | bash
RUN chmod a+x "$SDKMAN_DIR/bin/sdkman-init.sh"
RUN set -x \
&& echo "sdkman_auto_answer=true" > $SDKMAN_DIR/etc/config \
&& echo "sdkman_auto_selfupdate=false" >> $SDKMAN_DIR/etc/config \
&& echo "sdkman_insecure_ssl=false" >> $SDKMAN_DIR/etc/config
WORKDIR $SDKMAN_DIR
RUN [[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ]] && source "$SDKMAN_DIR/bin/sdkman-init.sh" && exec "$@"
RUN source /root/.bashrc
RUN source "$SDKMAN_DIR/bin/sdkman-init.sh" && sdk list java && sdk install java $JAVA_VERSION
# RUN source "$SDKMAN_DIR/bin/sdkman-init.sh" && sdk install grails $GRAILS_VERSION
# RUN curl -s "https://get.sdkman.io" | bash
# RUN source "$HOME/.sdkman/bin/sdkman-init.sh"
# RUN sdk install java 8.0.181-oracle
COPY ./app /app
ENV PATH="/root/.sdkman/candidates/java/current/bin/:${PATH}"
WORKDIR /app
RUN pip install -r requirements.txt
新的 docker 实施,研发后尝试。
要完成的任务 :- 在预定时间(即 5 分钟)后通过写入 CRON 运行 docker。
我写了一个简单的 java 应用程序,它只包含一个 println 语句。我想使用 Docker.
执行项目我的Dockerfile
:
FROM openjdk:8-jre-alpine
RUN mkdir /etc/test/
RUN chmod 777 /etc/test/
COPY /home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
CMD java -Xmx500M -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
我在 CMD 上执行了这个命令:- sudo docker build Documents/DockerTest
命令处理中:-
Sending build context to Docker daemon 7.159 MB
Step 1/5 : FROM openjdk:8-jre-alpine
---> b1bd879ca9b3
Step 2/5 : RUN mkdir /etc/test/
---> Using cache
---> 4720a4e8fa67
Step 3/5 : RUN chmod 777 /etc/test/
---> Using cache
---> 91426c394ae4
Step 4/5 : COPY /home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
lstat home/administrator/Documents/LearningWorkspace/DockerTesting/target/DockerTesting-0.0.1-SNAPSHOT.jar: no such file or directory
这个 Docker 文件到底有什么问题。
问题 2 --
现在,我的 docker 文件已成功执行,并且在 运行 上 docker Image java 应用程序的 println 语句打印在控制台上。
现在,我想在 docker 图像上执行 cron 作业,即在固定时间后 运行 特定 docker。
我通过更多的搜索和尝试将我的 docker 更改为这个:-
CRONTAB 文件:-
*/10 * * * * root java -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar 2>&1
已更新 DOCKER 文件:-
FROM openjdk:8-jre-alpine
RUN mkdir /etc/test/
RUN chmod 777 /etc/test/
ADD crontab /etc/cron
ADD jar/ /etc/test/
RUN chmod 0600 /etc/cron
CMD java -Xmx500M -jar /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
但它不起作用,它只打印语句。
Docker 文件中还有什么我遗漏的吗?
发生这种情况是因为您无法从 build context 外部向 Docker 容器添加任何文件:
Extended description
The docker build command builds Docker images from a Dockerfile and a “context”. A build’s context is the set of files located in the specified PATH or URL. The build process can refer to any of the files in the context. For example, your build can use a COPY instruction to reference a file in the context.
在您的 Dockerfile
旁边创建一个名为 jars
的目录,例如,放入您的 jar 文件,然后:
ADD jars/DockerTesting-0.0.1-SNAPSHOT.jar /etc/test/
或者您可以简单地从那里复制所有 jar:
ADD jars/ /etc/test/
这样你最终会得到一个里面有 /etc/test/DockerTesting-0.0.1-SNAPSHOT.jar
的容器。无论如何,将可执行文件放在 /etc
目录中有什么原因吗?我的意思是这会起作用,但人们希望只有系统配置文件。更合适的位置是 /var
或 /usr/share
,甚至 /app
;)
这是我从 fastapi Docker 容器(源于 tiangolo/uvicorn-gunicorn:python3.8
)运行 Java 的解决方案:
FROM tiangolo/uvicorn-gunicorn:python3.8
LABEL version="1.0"
LABEL description="Install any package using SDKMan"
ENV SDKMAN_DIR /root/.sdkman
# ENV GRAILS_VERSION 3.3.9
ENV JAVA_VERSION 8.0.282-open
RUN apt-get update && apt-get install -y zip curl
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN curl -s "https://get.sdkman.io" | bash
RUN chmod a+x "$SDKMAN_DIR/bin/sdkman-init.sh"
RUN set -x \
&& echo "sdkman_auto_answer=true" > $SDKMAN_DIR/etc/config \
&& echo "sdkman_auto_selfupdate=false" >> $SDKMAN_DIR/etc/config \
&& echo "sdkman_insecure_ssl=false" >> $SDKMAN_DIR/etc/config
WORKDIR $SDKMAN_DIR
RUN [[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ]] && source "$SDKMAN_DIR/bin/sdkman-init.sh" && exec "$@"
RUN source /root/.bashrc
RUN source "$SDKMAN_DIR/bin/sdkman-init.sh" && sdk list java && sdk install java $JAVA_VERSION
# RUN source "$SDKMAN_DIR/bin/sdkman-init.sh" && sdk install grails $GRAILS_VERSION
# RUN curl -s "https://get.sdkman.io" | bash
# RUN source "$HOME/.sdkman/bin/sdkman-init.sh"
# RUN sdk install java 8.0.181-oracle
COPY ./app /app
ENV PATH="/root/.sdkman/candidates/java/current/bin/:${PATH}"
WORKDIR /app
RUN pip install -r requirements.txt