Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Docker、Dockerfile和using在我开始下一个服务之前等待它_Java_Docker_Docker Compose_Dockerfile_Keycloak - Fatal编程技术网

Java Docker、Dockerfile和using在我开始下一个服务之前等待它

Java Docker、Dockerfile和using在我开始下一个服务之前等待它,java,docker,docker-compose,dockerfile,keycloak,Java,Docker,Docker Compose,Dockerfile,Keycloak,我有2个DockerFile,“应用程序”依赖于“sso” a) keydove Dockerfile:来自jboss/keydove-mysql:3.3.0.Final 此服务在我的docker-compose.yml文件中称为“sso” b) 我的wildfly服务Dockerfile:来自openjdk:8u111 jdk alpine我在这里部署java服务 此服务在我的docker-compose.yml文件中称为“app” 因此,“sso”服务key斗篷的部署需要一段时间。我希望在“

我有2个DockerFile,“应用程序”依赖于“sso”

a) keydove Dockerfile:
来自jboss/keydove-mysql:3.3.0.Final

此服务在我的docker-compose.yml文件中称为“sso”

b) 我的wildfly服务Dockerfile:
来自openjdk:8u111 jdk alpine
我在这里部署java服务

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

因此,“sso”服务key斗篷的部署需要一段时间。我希望在“sso”服务启动后部署我的“应用程序”。 关于我的配置,需要记住的一件事是“sso”启动8080端口的速度非常快,但需要花费时间才能将所有的KeyClope领域都准备好

这是我在应用程序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是在所有keydape领域就绪之前部署的。。。。。(在sso:8080启动后立即启动)

我的下一个尝试是(我相信你是如何等待它的)看看“主”领域是否已经建立并可用

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
这是行不通的

如果我手动执行操作,则应用程序可以工作,我会启动KeyClope(‘sso’)直到它被部署,然后启动‘应用程序’——但我似乎无法实现这一点

我还尝试了以下语法。。。也尝试过使用
--strict

ENTRYPOINT ["/sbin/tini", "--"]
CMD  /wait-for-it.sh sso:8080/auth/realms/master/ -t 360 -- java -jar accounts-api-swarm.jar -Sinitdata
我希望你能帮我一把


在这方面,我

您可以使用一个称为机制的容器来等待服务启动。在运行时处理这类事情应该比在构建时处理容易

您没有发布您的
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:

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

感谢您的努力grizzhedj!我没办法让它工作。如果你想试一试,这里是repo()-Makefile有所有的配方,“makeall”启动所有的容器。。。启动前,运行一次“生成初始化邮件”。我一直在研究wait-for-it.sh脚本,希望对其进行增强,以便它能够等待部署的服务(请参阅),这对发布repo很有帮助。您需要从DockerFile中删除
wait it.sh
行,然后重新生成这些图像。我更新了我的答案,提供了更多细节
docker-compose run --rm waitforsso
docker-compose up -d sso db api ws proxy ui