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

时间:2016-03-02 13:28:10

标签: java dockerfile vert.x

我试图在Docker容器上运行基于Vert.x Java的应用程序。我的应用程序运行很少的Verticle,它从内部启动。 我已将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)

我错过了什么?

以斯哈

5 个答案:

答案 0 :(得分:8)

根据FileResolver.java判断,vert.x默认尝试在当前工作目录中创建“.vertx”目录。您已配置名为“守护程序”的用户,您确定此用户对docker镜像中的工作目录具有写入权限吗?如果没有,请按docker-image-author-guidance中所述更改权限,或使用root用户恢复权限。

答案 1 :(得分:4)

此目录用于提供jar文件中包含的文件(例如,包装在胖jar中的Web资源)。如果您不使用此功能,则可以通过将vertx.disableFileCPResolving系统属性设置为true来禁用此目录的创建。您还可以使用vertx.cacheDirBase系统属性更改位置。

参考: https://groups.google.com/forum/#!topic/vertx/7cBbKrjYfeI

答案 2 :(得分:4)

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

  

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

vertx run my.Verticle -Dvertx.cacheDirBase=/tmp/vertx-cache
# or
java -jar my-fat.jar -Dvertx.cacheDirBase=/tmp/vertx-cache

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

link to documentation

答案 3 :(得分:0)

vert.x尝试在当前目录中创建cache-dir(.ver​​tx / file-cache-someuuid)。如果mkdirs()调用失败,则抛出给定的异常。 用户守护程序是否具有workdir中的足够权限?

答案 4 :(得分:0)

对我来说,尝试运行jar文件时也会遇到同样的问题。它突然开始出现,然后我被迫将jar文件作为ROOT运行一段时间,直到我终于受够了并开始彻底寻找原因。

  

发生这种情况是因为我意外地在SUDO中运行过jar文件   特权,.vertx文件夹已创建为ROOT帐户。

     

在尝试使用ll别名时,最初无法弄清楚   亚马逊Linux中的命令,可惜它不显示隐藏的文件夹

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

  

已删除的.vertx文件夹和jar文件再次开始正常工作,原因是   普通用户。