我有两个Dockerfiles,"app"依赖于"sso"。
a) 密钥斗篷Dockerfile:FROM jboss/keycloak-mysql:3.3.0.Final
这个服务在我的docker-compose.yml-file 中被称为"sso">
b) 我的wildfly服务Dockerfile:FROM openjdk:8u111-jdk-alpine
,我在其中部署java服务
这个服务在我的docker-compose.yml-file 中被称为"应用程序">
因此,密钥斗篷"sso"服务需要一段时间才能部署。我希望我的"应用程序"在"sso"服务启动后部署。关于我的配置,需要记住的一点是,"sso"启动端口8080的速度相当快,但需要时间才能将所有密钥斗篷领域都安装到位。
这是我在"应用程序"Dockerfile 中的第一个方法
FROM openjdk:8u111-jdk-alpine
RUN apk update && apk add --no-cache tini openssl bash
COPY target/accounts-api-swarm.jar /usr/src/myapp/
WORKDIR /usr/src/myapp
RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -O /wait-for-it.sh && chmod +x /wait-for-it.sh
ENTRYPOINT ["/tini", "--", "/wait-for-it.sh", "sso:8080", "-t", "360", "--"]
CMD java -jar accounts-api-swarm.jar -Sinitdata
这种方法不起作用,因为accounts-api-swarm.jar是在所有密钥斗篷领域就位之前部署的。。。。。(在sso:8080启动后立即启动)
我的下一个尝试是(how_I_bealieve_wait-for-it.sh_works),看看"大师"领域是否已经启动并可用。
FROM openjdk:8u111-jdk-alpine
RUN apk update && apk add --no-cache tini openssl bash
COPY target/accounts-api-swarm.jar /usr/src/myapp/
WORKDIR /usr/src/myapp
RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
-O /wait-for-it.sh
&& chmod +x /wait-for-it.sh
ENTRYPOINT ["/tini", "--", "/wait-for-it.sh", "sso:8080/auth/realms/master/", "-t", "360", "--"]
CMD java -jar accounts-api-swarm.jar -Sinitdata
这行不通。
如果我手动操作,应用程序就会工作,我会启动keycloft("so"),直到它被部署,然后启动"应用程序"——但我似乎无法使其工作。。。。
我还尝试了以下语法。。。尝试使用--strict
和
ENTRYPOINT ["/sbin/tini", "--"]
CMD /wait-for-it.sh sso:8080/auth/realms/master/ -t 360 -- java -jar accounts-api-swarm.jar -Sinitdata
我希望你能在这里帮我一把。
问候,i
您可以使用名为dadarek/wait-for dependencies的容器作为等待服务启动的机制。在运行时处理这类事情应该比在构建时处理更容易。
您没有发布docker-compose.yml
文件,但以下是如何实现它
1) 。将新服务添加到您的docker-compose.yml
waitforsso:
image: dadarek/wait-for-dependencies
depends_on:
- sso
command: sso:8080
你的docker-compose.yml现在看起来应该是这样的:
version: '3'
services:
waitforsso:
image: dadarek/wait-for-dependencies
depends_on:
- sso
command: sso:8080
# MySQL database for Keycloak
db:
image: mysql:5.7
env_file: ./env/.envmysql
volumes:
- db_accounts:/var/lib/mysql
# Keycloak server
sso:
image: dina/keycloak:v0.1
env_file:
- ./env/.envmysql
- ./env/.envaccounts
environment:
- TZ=Europe/Stockholm
- MYSQL_PORT_3306_TCP_ADDR=mysql
- MYSQL_PORT_3306_TCP_PORT=3306
- PROXY_ADDRESS_FORWARDING=true
links:
- db:mysql
# Java JSON-API
api:
image: dina/accounts-api:v0.1
env_file:
- ./env/.envaccounts
environment:
- VIRTUAL_HOST=alpha-api.dina-web.net
volumes:
- ./env/.envapi:/usr/src/myapp/project-initdata.yml
ports:
- "8181:8181"
# Keycloak API proxy
ws:
image: nginx
container_name: alpha-sso.dina-web.net
environment:
- VIRTUAL_HOST=alpha-sso.dina-web.net
# links:
# - api
volumes:
- ./nginx-conf/app.conf:/etc/nginx/conf.d/app.conf
- ./nginx-certs:/etc/nginx/ssl
depends_on:
- waitforsso
- db
# Ember frontend
ui:
image: dina/accounts-ui:v0.1
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.template
environment:
- VIRTUAL_HOST=alpha-accounts.dina-web.net
- VIRTUAL_PROTO=http
- NGINX_HOST=alpha-accounts.dina-web.net
- NGINX_PORT=80
command: /bin/ash -c "envsubst '$$NGINX_HOST $$NGINX_PORT $$NGINX_ROOT $$NGINX_INDEX' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
# Generic proxy
proxy:
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs
volumes:
db_accounts:
3) 。您必须从相关Dockerfiles中删除任何与wait-for-it.sh
相关的内容,然后重建这些映像。
4) 。启动组成
docker-compose run --rm waitforsso
docker-compose up -d sso db api ws proxy ui
结果是您的ws
服务现在应该等待端口8080启动(即您的sso
服务启动)