Docker,Dockerfile,并在开始我的下一个服务之前使用等待

我有2个Dockerfiles,'app'依赖于'sso'。

a)keycloak-Dockerfile: FROM jboss/keycloak-mysql:3.3.0.Final

这个服务在我的docker-compose.yml文件中被称为'sso'

b)我的野蛮服务Dockerfile: FROM openjdk:8u111-jdk-alpine在那里我部署我的java服务

这个服务在我的docker-compose.yml文件中被称为“app”

因此,这个'sso'服务需要一段时间才能部署。 我希望我的'应用程序'在'sso'服务启动后部署。 关于我的configuration有一点要记住,'sso'启动端口8080相当快,但需要时间来获得所有的keycloak-realms。

这是我的'app'-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是在所有keycloak领域都已经部署之前部署的(刚刚在sso:8080启动之后)

我的下一个尝试是(how_I_believe_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 

这是行不通的。

应用程序的工作,如果我手动做的事情,我启动keycloak('sso')等待,直到它被部署,然后我启动'应用程序' – 但我似乎无法做到这一点….

我也试过下面的语法…尝试使用 – 严格以及

 ENTRYPOINT ["/sbin/tini", "--"] CMD /wait-for-it.sh sso:8080/auth/realms/master/ -t 360 -- java -jar accounts-api-swarm.jar -Sinitdata 

我希望你能在这里帮我一把。

问候,我

您可以使用名为dadarek / wait-for-dependencies的容器作为等待服务启动的机制。 在运行时处理这种types的东西应该比在构build时处理更容易。

你没有发布你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)。 您必须从相关的Docker文件中删除与wait-for-it.sh相关的任何内容,然后重build这些图像。

4)。 启动撰写

 docker-compose run --rm waitforsso docker-compose up -d sso db api ws proxy ui 

结果是你的ws服务现在应该等待端口8080(即你的sso服务被启动)