如何解决 Gradle docker 图像在 Raspberry Pi 上冻结并出现单调时钟警告的问题?
How to solve Gradle docker image freezing on Raspberry Pi with warning about monotonic clock?
我正在尝试设置一个 Docker 容器来构建和运行一个小型应用程序。这是我的 Docker 文件:
#####################
# build the jar
#####################
FROM gradle:jdk11 as builder
COPY --chown=gradle:gradle application /application
WORKDIR /application
RUN gradle build
#####################
# run the app
#####################
# Use this on a non-arm machine
# FROM openjdk:11
# Use this on an arm machine, such as a raspberry pi
FROM arm32v7/adoptopenjdk:11
EXPOSE 8080
COPY --from=builder /application/build/libs/myjar.jar .
WORKDIR /
CMD java -jar ./myjar.jar
docker build -t myimage .
在我的个人机器(Macbook Pro)上运行没有问题。如果我尝试在 Raspberry Pi 4B(最终目标)上构建图像,它会挂在 RUN gradle build
步骤并且永远不会完成。
这是我的终端输出:
pi@raspberrypi:~/development/my_test $ docker build -t test .
Sending build context to Docker daemon 15.92MB
Step 1/9 : FROM gradle:jdk11 as builder
---> 0924090a3770
Step 2/9 : COPY --chown=gradle:gradle application /application
---> Using cache
---> b702fc76b9cb
Step 3/9 : WORKDIR /application
---> Using cache
---> dbc2aac75c7c
Step 4/9 : RUN gradle --no-daemon build
---> Running in faec45c6cf01
OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes
就是这样。没有进一步的事情发生。
起初,我忽略了 OpenJDK 警告,因为我在其他图像中看到它并且没有问题 运行。在所有其他选项都失败后,我开始怀疑它可能是罪魁祸首。如何解决?
我找到了解决方案:事实证明,丢失的单调时钟会导致 java 出现不可预测的行为。有些应用程序 运行,有些有错误,有些没有启动。事实证明,缺少时钟问题可以通过安装 libseccomp 2.4.2
或更高版本来解决,不幸的是,pi 上的 apt
无法提供服务。所以目前唯一的方法似乎是手动安装 here, from the source page here。我这样做了,错误消失了,Gradle 开始 运行,构建我的应用程序并将正确的输出打印到终端。
我成功测试了 Raspberry Pi 4(Raspbian 10 破坏者)的 jdk 16 和 jdk 17 的以下解决方案:
#Add dep Key
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
#Add dep
sudo echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
#Update and Install
sudo apt update
sudo apt install libseccomp2 -t buster-backports
我正在尝试设置一个 Docker 容器来构建和运行一个小型应用程序。这是我的 Docker 文件:
#####################
# build the jar
#####################
FROM gradle:jdk11 as builder
COPY --chown=gradle:gradle application /application
WORKDIR /application
RUN gradle build
#####################
# run the app
#####################
# Use this on a non-arm machine
# FROM openjdk:11
# Use this on an arm machine, such as a raspberry pi
FROM arm32v7/adoptopenjdk:11
EXPOSE 8080
COPY --from=builder /application/build/libs/myjar.jar .
WORKDIR /
CMD java -jar ./myjar.jar
docker build -t myimage .
在我的个人机器(Macbook Pro)上运行没有问题。如果我尝试在 Raspberry Pi 4B(最终目标)上构建图像,它会挂在 RUN gradle build
步骤并且永远不会完成。
这是我的终端输出:
pi@raspberrypi:~/development/my_test $ docker build -t test .
Sending build context to Docker daemon 15.92MB
Step 1/9 : FROM gradle:jdk11 as builder
---> 0924090a3770
Step 2/9 : COPY --chown=gradle:gradle application /application
---> Using cache
---> b702fc76b9cb
Step 3/9 : WORKDIR /application
---> Using cache
---> dbc2aac75c7c
Step 4/9 : RUN gradle --no-daemon build
---> Running in faec45c6cf01
OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes
就是这样。没有进一步的事情发生。
起初,我忽略了 OpenJDK 警告,因为我在其他图像中看到它并且没有问题 运行。在所有其他选项都失败后,我开始怀疑它可能是罪魁祸首。如何解决?
我找到了解决方案:事实证明,丢失的单调时钟会导致 java 出现不可预测的行为。有些应用程序 运行,有些有错误,有些没有启动。事实证明,缺少时钟问题可以通过安装 libseccomp 2.4.2
或更高版本来解决,不幸的是,pi 上的 apt
无法提供服务。所以目前唯一的方法似乎是手动安装 here, from the source page here。我这样做了,错误消失了,Gradle 开始 运行,构建我的应用程序并将正确的输出打印到终端。
我成功测试了 Raspberry Pi 4(Raspbian 10 破坏者)的 jdk 16 和 jdk 17 的以下解决方案:
#Add dep Key
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
#Add dep
sudo echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
#Update and Install
sudo apt update
sudo apt install libseccomp2 -t buster-backports