Java 基于Vert.x的应用程序在docker容器上崩溃

Java 基于Vert.x的应用程序在docker容器上崩溃,java,dockerfile,vert.x,Java,Dockerfile,Vert.x,我正在尝试在Docker容器上运行一个基于Vert.xJava的应用程序。我的应用程序运行几个从自身内部启动的垂直。 我已将jar文件放在一个文件夹中,并创建了一个Dockerfile,其中包含以下内容: FROM vertx/vertx3 ENV VERTICLE_FILE Medical-1.0-SNAPSHOT.jar ENV VERTICLE_HOME /performit/web/vertx/verticles/ COPY $VERTICLE_FILE $VERTICLE_HOME/

我正在尝试在Docker容器上运行一个基于Vert.xJava的应用程序。我的应用程序运行几个从自身内部启动的垂直。 我已将jar文件放在一个文件夹中,并创建了一个Dockerfile,其中包含以下内容:

FROM vertx/vertx3
ENV VERTICLE_FILE Medical-1.0-SNAPSHOT.jar 
ENV VERTICLE_HOME /performit/web/vertx/verticles/
COPY $VERTICLE_FILE $VERTICLE_HOME/  
WORKDIR $VERTICLE_HOME
ENTRYPOINT ["sh", "-c"]
EXPOSE 8080
CMD ["java -jar $VERTICLE_FILE"]
USER daemon
我用命令创建一个图像

$ sudo docker build -t medical-main .
然后,我尝试使用以下行创建一个容器:

sudo docker run --name medical-main -p 8080:8080 -d  medical-main
此操作失败,日志显示以下内容:

java.lang.IllegalStateException: Failed to create cache dir
at io.vertx.core.impl.FileResolver.setupCacheDir(FileResolver.java:257)
at io.vertx.core.impl.FileResolver.<init>(FileResolver.java:79)
at io.vertx.core.impl.VertxImpl.<init>(VertxImpl.java:138)
at io.vertx.core.impl.VertxImpl.<init>(VertxImpl.java:114)
at io.vertx.core.impl.VertxImpl.<init>(VertxImpl.java:110)
at io.vertx.core.impl.VertxFactoryImpl.vertx(VertxFactoryImpl.java:34)
at io.vertx.core.Vertx.vertx(Vertx.java:79)
java.lang.IllegalStateException:无法创建缓存目录
位于io.vertx.core.impl.FileResolver.setupCacheDir(FileResolver.java:257)
位于io.vertx.core.impl.FileResolver。(FileResolver.java:79)
位于io.vertx.core.impl.VertxImpl.(VertxImpl.java:138)
位于io.vertx.core.impl.VertxImpl.(VertxImpl.java:114)
位于io.vertx.core.impl.VertxImpl.(VertxImpl.java:110)
位于io.vertx.core.impl.VertxFactoryImpl.vertx(VertxFactoryImpl.java:34)
在io.vertx.core.vertx.vertx(vertx.java:79)
我错过了什么


Izhar

根据判断,默认情况下,vert.x尝试在当前工作目录中创建一个“.vertx”目录。您已经配置了一个名为“daemon”的用户,您确定该用户对docker映像中的工作目录具有写访问权限吗?如果没有,请更改中概述的权限,或恢复使用根用户。

vert.x尝试在当前目录中创建缓存目录(.vertx/file cache someuuid)。如果mkdirs()调用失败,将引发给定的异常。
用户守护程序在workdir中是否具有足够的权限?

此目录用于提供jar文件中包含的文件(例如打包在fat jar中的web资产)。如果未使用此功能,可以通过将vertx.disableFileCPResolving系统属性设置为true来禁用此目录的创建。也可以使用vertx.cacheDirBase系统属性更改位置

参考:

当Vert.x尝试创建
.vertx
(缓存目录)以便从类路径或类路径上的文件复制和读取文件时,会导致此异常。有可能,
$user
没有创建缓存目录的权限

cachedir背后的原因很简单:从jar或输入流读取文件是阻塞的。因此,为了避免每次都要付出代价,Vert.x将文件复制到其缓存目录,并在每次后续读取时从那里读取。可以配置此行为

否则,您可以完全避免这种行为,使用
-Dvertx.disableFileCaching=true
启动应用程序。使用此设置,Vert.x仍然使用缓存,但始终使用原始源刷新缓存中存储的版本。因此,如果编辑从类路径提供的文件并刷新浏览器,Vert.x将从类路径读取该文件,将其复制到缓存目录并从那里提供服务请勿在制作中使用此设置,它会扼杀您的表演。


对于我来说,在尝试运行jar文件时也遇到了同样的问题。它开始突然出现,然后我被迫以ROOT用户身份运行jar文件一段时间,直到我最终厌倦并开始彻底寻找原因

这是因为我在SUDO中意外地运行了一次jar文件 特权和.vertx文件夹被创建为根帐户

起初我无法理解这一点,因为我正在尝试
ll
alias 命令,但遗憾的是它不显示隐藏的文件夹

因此,当我下次彻底调查这个问题时,我还尝试了.vertx文件夹中显示的
ls-al
,我发现问题在于它是作为SUDO用户创建的

已删除的.vertx文件夹和jar文件开始正常工作,如下所示: 普通用户


谢谢,我删除了守护程序的定义并添加了had权限集,这就解决了这个问题。哇,我花了太多时间试图解决这个问题。找到这个答案也不容易,但这正是我的问题所在。非常感谢。
vertx run my.Verticle -Dvertx.cacheDirBase=/tmp/vertx-cache
# or
java -jar my-fat.jar -Dvertx.cacheDirBase=/tmp/vertx-cache