我有2个Dockerfiles,' app'依赖于''
a)keycloak-Dockerfile:FROM jboss/keycloak-mysql:3.3.0.Final
这项服务名为“sso'在我的docker-compose.yml-file
中 b)我的wildfly服务Dockerfile:FROM openjdk:8u111-jdk-alpine
我在哪里部署我的java-service
这项服务名为“app'在我的docker-compose.yml-file
中因此,密钥泄露,即服务,需要一段时间才能部署。我想要我的应用程序'在“服务”服务开始后进行部署。 关于我的配置要记住的一件事是' 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
这种方法不起作用,因为在所有keycloak领域到位之前部署了account-api-swarm.jar .....(在sso之后启动:8080已经启动)
我的下一次尝试是(how_I_believe_wait-for-it.sh_works)来查看' master'领域已经可用。
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
这不起作用。
如果我手动执行此操作,应用程序可以正常工作,我启动keycloak(' sso')等待它部署,然后我启动' app' - 但我似乎无法完成这项工作......
我还尝试了以下语法...尝试使用--strict
ENTRYPOINT ["/sbin/tini", "--"]
CMD /wait-for-it.sh sso:8080/auth/realms/master/ -t 360 -- java -jar accounts-api-swarm.jar -Sinitdata
我希望你能帮助我。
问候,我
答案 0 :(得分:0)
您可以使用名为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
服务已启动)