构建并 运行 Docker Quarkus 图像
Build and Run Docker Image of Quarkus
我尝试使用 Quarkus 创建一个简单的微服务项目。可以构建本机可执行文件,但无法启动已创建应用程序的 Docker 容器。
微服务使用 OIDC 进行身份验证,即微服务从调用方接收必须有效的 JWT。 JWT 由 Keycloak 应用程序发布和验证。该应用程序使用 PostgreSQL 数据库。 Keycloak 和 Postgres 运行 作为 Docker 容器。整个部署仍然只与本地机器相关。
我添加了扩展名 quarkus-container-image-docker
。我正在使用 Maven 及以下版本,我列出了 pom.xml
.
中的所有扩展
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-docker</artifactId>
</dependency>
</dependencies>
我用的是LinuxOS.
我可以使用以下命令构建我所有微服务的本机可执行文件。执行和调用它们工作正常。
./mvnw package -Pnative -DskipTests
./target/<artifact>-<version>-runner
我修改了 Dockerfile.native
中的端口,因为我更改了每个服务 运行 上的端口。下面的代码显示了一个 Dockerfile.native
端口 8081
.
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application
EXPOSE 8081
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
我可以使用这些本机可执行文件构建 Docker 图像。
sudo docker build -f src/main/docker/Dockerfile.native -t <user>/<artifact> .
但是,当我尝试使用以下命令从映像启动容器时,
sudo docker run -i --rm -p 8081:8081 <user>/<artifact>:latest
我得到一个错误:
./application: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./application)
在我研究的过程中,我发现了另一个有趣的选项来告诉 Maven 插件构建容器。
sudo ./mvnw package -Pnative -DskipTests -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true
从生成的图像启动容器也会导致错误。
ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.net.ConnectException: Connection refused
at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST:Ljava_net_ConnectException_2_0002e_0003cinit_0003e_00028Ljava_lang_String_2_00029V(JNIJavaCallWrappers.java:0)
at sun.nio.ch.SocketChannelImpl.checkConnect(SocketChannelImpl.java)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779)
at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:834)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
有人可以向我提供一些信息,说明如何处理这种情况以允许 Docker 构建,然后可以成功 运行 吗?
如@RobertvanderSpek 所述,微服务无法再与 keycloak
和 postgres
容器通信。为了像以前一样允许服务之间的通信,最简单的解决方法是在启动时将微服务容器连接到网络 host
因为 containers in this network are not isolated from the host OS.
以下命令表示在所提供情况下 运行 容器的示例命令。
docker run --network host <user>/<artifact>
要查看整个基于微服务的应用系统,请参阅the GitHub repo. Detailed explanations on how to Dockerise a microservice can be found in the subfolders of each microservice。
我尝试使用 Quarkus 创建一个简单的微服务项目。可以构建本机可执行文件,但无法启动已创建应用程序的 Docker 容器。
微服务使用 OIDC 进行身份验证,即微服务从调用方接收必须有效的 JWT。 JWT 由 Keycloak 应用程序发布和验证。该应用程序使用 PostgreSQL 数据库。 Keycloak 和 Postgres 运行 作为 Docker 容器。整个部署仍然只与本地机器相关。
我添加了扩展名 quarkus-container-image-docker
。我正在使用 Maven 及以下版本,我列出了 pom.xml
.
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-docker</artifactId>
</dependency>
</dependencies>
我用的是LinuxOS.
我可以使用以下命令构建我所有微服务的本机可执行文件。执行和调用它们工作正常。
./mvnw package -Pnative -DskipTests
./target/<artifact>-<version>-runner
我修改了 Dockerfile.native
中的端口,因为我更改了每个服务 运行 上的端口。下面的代码显示了一个 Dockerfile.native
端口 8081
.
FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3
WORKDIR /work/
RUN chown 1001 /work \
&& chmod "g+rwX" /work \
&& chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application
EXPOSE 8081
USER 1001
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
我可以使用这些本机可执行文件构建 Docker 图像。
sudo docker build -f src/main/docker/Dockerfile.native -t <user>/<artifact> .
但是,当我尝试使用以下命令从映像启动容器时,
sudo docker run -i --rm -p 8081:8081 <user>/<artifact>:latest
我得到一个错误:
./application: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./application)
在我研究的过程中,我发现了另一个有趣的选项来告诉 Maven 插件构建容器。
sudo ./mvnw package -Pnative -DskipTests -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true
从生成的图像启动容器也会导致错误。
ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.net.ConnectException: Connection refused
at com.oracle.svm.jni.JNIJavaCallWrappers.jniInvoke_VA_LIST:Ljava_net_ConnectException_2_0002e_0003cinit_0003e_00028Ljava_lang_String_2_00029V(JNIJavaCallWrappers.java:0)
at sun.nio.ch.SocketChannelImpl.checkConnect(SocketChannelImpl.java)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779)
at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:834)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
有人可以向我提供一些信息,说明如何处理这种情况以允许 Docker 构建,然后可以成功 运行 吗?
如@RobertvanderSpek 所述,微服务无法再与 keycloak
和 postgres
容器通信。为了像以前一样允许服务之间的通信,最简单的解决方法是在启动时将微服务容器连接到网络 host
因为 containers in this network are not isolated from the host OS.
以下命令表示在所提供情况下 运行 容器的示例命令。
docker run --network host <user>/<artifact>
要查看整个基于微服务的应用系统,请参阅the GitHub repo. Detailed explanations on how to Dockerise a microservice can be found in the subfolders of each microservice。