docker - 在 docker 镜像上使用 KeyCloak 运行 Wildfly Swarm

标签 docker dockerfile keycloak wildfly-swarm

我创建了小Wildfly Swarm申请与 KeyCloak服务器使用 WildFly Swarm Project Generator我添加了一些代码,使用以下命令构建并启动了我的 fat jar :

java -jar -Dswarm.port.offset=100 login-service-swarm.jar

在应用程序启动后,我创建了新领域添加了用户等。然后我注意到 keycloak 在我的目标文件夹中创建了 3 个文件。那些文件:
  • keycloak.h2.db
  • keycloak.lock.db
  • keycloak.trace.db

  • 然后我决定创建 docker 镜像并在本地 docker 环境中运行它。所以我创建了docker文件:
    FROM java:openjdk-8-jdk
    ADD login-service-swarm.jar /opt/login-service-swarm.jar
    ADD keycloak.h2.db /opt/keycloak.h2.db
    ADD keycloak.lock.db /opt/keycloak.lock.db
    ADD keycloak.trace.db /opt/keycloak.trace.db
    
    EXPOSE 8180
    ENTRYPOINT ["java", "-jar", "-Dswarm.port.offset=100", "/opt/login-service-swarm.jar"]
    

    构建图像使用:
    docker build -f Dockerfile -t login-service-swarm-v1 .
    

    图像在我的 docker 图像列表中可见:
       C:\Work\Java\login-service\docker>docker images
    REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
    login-service-swarm-v1       latest              710cddc59623        About a minute ago   790 MB
    <none>                       <none>              100c0ee60f25        3 hours ago          779 MB
    demo                         latest              03d12d49ba5e        4 hours ago          760 MB
    java                         openjdk-8-jdk       d23bdf5b1b1b        5 months ago         643 MB
    

    所以我开始使用它:
    docker run -p 8180:8180 login-service-swarm-v1
    

    它看起来还可以,但是当我转到 localhost:8180/auth 并尝试登录时,我收到了错误的用户名和密码消息,因此我无法登录 keycloak。所以我想知道这是为什么?因为我手动包括
    docker 镜像中的 keycloak 数据库文件,如果我运行以下命令,您可以看到所有文件都按预期存在。
    PS C:\> docker ps
    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
    8bb4bdb3945e        login-service-swarm-v1       "java -jar -Dswarm..."   2 minutes ago       Up 2 minutes        0.0.0.0:8180->8180/tcp   blissful_knuth
    PS C:\> docker exec -it 8bb4bdb3945e bash
    root@8bb4bdb3945e:/# ls
    bin  boot  dev  etc  home  keycloak.h2.db  keycloak.lock.db  keycloak.trace.db  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@8bb4bdb3945e:/# cd opt
    root@8bb4bdb3945e:/opt# ls
    keycloak.h2.db  keycloak.lock.db  keycloak.trace.db  login-service-swarm.jar
    

    那么收获在哪里呢??

    最佳答案

    看起来 Swarm Keycloak 服务器在默认情况下读取了执行 java(意味着 user.dir)的目录中的 keycloak*.db。容器中的 swarm 进程不读取/opt/keycloak*.db,因为 java 在 / 上运行.

    您可以使用 wildfly.swarm.keycloak.server.db 更改数据目录系统 Prop 。
    https://github.com/wildfly-swarm/wildfly-swarm/blob/2017.6.1/fractions/keycloak-server/src/main/java/org/wildfly/swarm/keycloak/server/runtime/KeycloakDatasourceCustomizer.java#L52

    请在 Dockerfile 中尝试一下;

    ENTRYPOINT ["java", "-jar", "/opt/login-service-swarm.jar", "-Dwildfly.swarm.keycloak.server.db=/opt/keycloak"]
    

    或者,您也可以使用 -w选项与 docker run .
    $ docker run --help
    -w, --workdir string              Working directory inside the container
    

    以下命令应该也可以工作。
    docker run -p 8180:8180 -w /opt login-service-swarm-v1
    

    附言

    我建议使用 Volume 或 Volume Container 而不是在 Dockerfile 中添加数据文件。
    https://docs.docker.com/engine/tutorials/dockervolumes/

    关于docker - 在 docker 镜像上使用 KeyCloak 运行 Wildfly Swarm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44778512/

    相关文章:

    node.js - 复制失败: no source files were specified while docker-compose up

    oauth-2.0 - 使用 keycloak 限制单个领域中的客户端访问

    key 斗篷错误: client_not_found reason: cannot_match_source_hash

    docker docker 注册表(它的私有(private)安装)使用 https (tls/ssl)

    c# - 如何在 Windows 中使用 C# 客户端创建具有静态 IP 的 docker 网络

    docker - 无法在 ubuntu 上使用 EFK 堆栈获取 Kubernetes 集群的日志

    node.js - "localhost didn' t 发送数据。 ERR_EMPTY_RESPONSE "and " curl : (52) Empty reply from server"

    windows - Docker在Linux环境而不是Windows环境下撰写工作

    java - 示例 keycloak spring-boot 应用程序找不到 bean KeycloakSpringBootConfigResolver

    docker - Docker 容器内推荐的 GCE 服务帐户身份验证?