运行 在 docker 图像上使用 KeyCloak 的 Wildfly Swarm
Running Wildfly Swarm with KeyCloak on docker image
我创建了小 Wildfly Swarm application with KeyCloak server using WildFly Swarm Project Generator 我添加了一些代码,构建并启动了我的 fat jar 使用:
java -jar -Dswarm.port.offset=100 login-service-swarm.jar
应用程序启动后,我创建了新领域,添加了用户等。然后我注意到 keycloak 在我的目标文件夹中创建了 3 个文件。那些文件:
- 钥匙斗篷。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 服务器默认读取执行目录中的 keycloak*.db java(表示 user.dir
)。容器中的群进程不读取 /opt/keycloak*.db 因为 java 在 /
.
上运行
您可以使用 wildfly.swarm.keycloak.server.db
sysprop 更改数据目录。
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
P.S.
我建议使用 Volume 或 Volume Container,而不是将数据文件添加到 Dockerfile 中。
https://docs.docker.com/engine/tutorials/dockervolumes/
我创建了小 Wildfly Swarm application with KeyCloak server using WildFly Swarm Project Generator 我添加了一些代码,构建并启动了我的 fat jar 使用:
java -jar -Dswarm.port.offset=100 login-service-swarm.jar
应用程序启动后,我创建了新领域,添加了用户等。然后我注意到 keycloak 在我的目标文件夹中创建了 3 个文件。那些文件:
- 钥匙斗篷。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 服务器默认读取执行目录中的 keycloak*.db java(表示 user.dir
)。容器中的群进程不读取 /opt/keycloak*.db 因为 java 在 /
.
您可以使用 wildfly.swarm.keycloak.server.db
sysprop 更改数据目录。
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
P.S.
我建议使用 Volume 或 Volume Container,而不是将数据文件添加到 Dockerfile 中。 https://docs.docker.com/engine/tutorials/dockervolumes/