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

Vert.x based application crashes on docker container

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

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)

我错过了什么?

伊扎尔

根据 FileResolver.java, vert.x tries to create a ".vertx" directory in the current working directory by default. You have configured a user called "daemon", are you sure that this user has write access to the working dir in the docker image? If not, change the permissions as outlined in docker-image-author-guidance 判断,或恢复使用 root 用户。

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

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

更改位置

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

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

The reason behind cache dir is simple: reading a file from a jar or from an input stream is blocking. So to avoid to pay the price every time, Vert.x copies the file to its cache directory and reads it from there every subsequent read. This behavior can be configured.

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

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

It happened because I accidentally ran jar file once in SUDO privileges and the .vertx folder was create as ROOT account.

I could not figure this out initially as I was trying ll alias command in amazon linux and sadly it does not display hidden folders

所以当我下次彻底调查这个问题时,我也尝试了 ls -al,它显示在 .vertx 文件夹中,我发现问题是它是以 SUDO 用户创建的。

Deleted .vertx folder and jar file started working normally again as normal user.