在Docker镜像上运行带有KeyCloak的Wildfly Swarm

5

我使用WildFly Swarm项目生成器创建了一个小的Wildfly Swarm应用,并使用KeyCloak服务器。我添加了一些代码,构建并启动了我的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

那么问题在哪里呢?

login-service-swarm是用来作为Keycloak服务器还是由Keycloak保护的微服务? 目前这对我来说不太清楚。 - Ken
@Ken:login-service-swarm 是一个Keycloak服务器。 - Kiki
1个回答

5
看起来 Swarm Keycloak 服务器默认读取执行 java 的目录(即 user.dir)中的 keycloak*.db 文件。容器中的 Swarm 进程不会读取 /opt/keycloak*.db,因为 Java 在 / 上运行。
您可以使用 wildfly.swarm.keycloak.server.db 系统属性更改数据目录。 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"]

或者,您也可以使用docker run命令的-w选项。

$ docker run --help
-w, --workdir string              Working directory inside the container

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

P.S.

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


运行得很好。谢谢! - Kiki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接