首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建并运行Quarkus的Docker映像

构建并运行Quarkus的Docker映像
EN

Stack Overflow用户
提问于 2021-01-08 19:25:15
回答 1查看 1.4K关注 0票数 0

我尝试使用Quarkus创建一个简单的微服务项目。可以构建本机可执行文件,但无法启动所创建应用程序的Docker容器。

微服务使用OIDC进行身份验证,即微服务从调用者接收必须有效的JWT。JWTs由Keycloak应用程序发布和验证。应用程序使用PostgreSQL数据库。Keycloak和Postgres都作为Docker容器运行。整个部署仍然只与本地计算机相关。

我添加了扩展名quarkus-container-image-docker。我使用的是Maven,下面列出了我在pom.xml中的所有扩展。

代码语言:javascript
复制
  <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>

我使用的是Linux操作系统。

我可以使用以下命令构建所有微服务的本机可执行文件。执行和调用它们可以很好地工作。

代码语言:javascript
复制
./mvnw package -Pnative -DskipTests
./target/<artifact>-<version>-runner

我修改了Dockerfile.native中的端口,因为我更改了每个服务在其上运行的端口。以下代码显示了一个端口为8081Dockerfile.native

代码语言:javascript
复制
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镜像。

代码语言:javascript
复制
sudo docker build -f src/main/docker/Dockerfile.native -t <user>/<artifact> .

但是,当我尝试使用以下命令从镜像启动容器时,

代码语言:javascript
复制
sudo docker run -i --rm -p 8081:8081 <user>/<artifact>:latest

我得到一个错误:

代码语言:javascript
复制
./application: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./application)

在我研究的过程中,我发现了另一个有趣的选择来告诉Maven插件构建一个容器。

代码语言:javascript
复制
sudo ./mvnw package -Pnative -DskipTests -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true

从生成的镜像启动容器也会导致错误。

代码语言:javascript
复制
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$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.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构建,然后可以成功运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-30 01:22:42

正如@RobertvanderSpek所描述的,微服务不能再与keycloakpostgres容器对话。要像以前一样允许服务之间的通信,最简单的解决方法是在启动时将微服务容器连接到网络host,因为containers in this network are not isolated from the host OS

以下命令是在所提供的情况下运行容器的示例命令。

代码语言:javascript
复制
docker run --network host <user>/<artifact>

要查看整个基于微服务的应用系统,请参阅the GitHub repo。有关如何对接微服务的详细说明,可在subfolders of each microservice中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65628096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档