我试图在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)
我错过了什么?
以斯哈
答案 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将从类路径读取文件,将其复制到缓存目录并从那里提供文件。 请勿在生产环境中使用此设置,它可能会破坏您的表演。
答案 3 :(得分:0)
vert.x尝试在当前目录中创建cache-dir(.vertx / file-cache-someuuid)。如果mkdirs()调用失败,则抛出给定的异常。 用户守护程序是否具有workdir中的足够权限?
答案 4 :(得分:0)
对我来说,尝试运行jar文件时也会遇到同样的问题。它突然开始出现,然后我被迫将jar文件作为ROOT运行一段时间,直到我终于受够了并开始彻底寻找原因。
发生这种情况是因为我意外地在SUDO中运行过jar文件 特权,.vertx文件夹已创建为ROOT帐户。
在尝试使用
ll
别名时,最初无法弄清楚 亚马逊Linux中的命令,可惜它不显示隐藏的文件夹
因此,当我下次彻底调查该问题时,我还尝试了显示在.vertx文件夹中的ls -al
,并且发现该问题是作为SUDO用户创建的。
已删除的.vertx文件夹和jar文件再次开始正常工作,原因是 普通用户。