繁体   English   中英

Docker,Dockerfile并在我开始下一个服务之前使用wait-for-it

[英]Docker, Dockerfile and using wait-for-it before I start my next service

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

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

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

b)我的wildfly服务Dockerfile: FROM openjdk:8u111-jdk-alpine我部署我的java服务

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

因此,关键斗篷,'sso'服务需要一段时间才能部署。 我想在'sso'服务开始后部署我的'app'。 关于我的配置要记住的一件事是'sso'启动端口8080非常快,但需要时间来获得所有的keycloak领域。

这是我在'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

这种方法不起作用,因为在所有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

我希望你能帮助我。

问候,我

您可以使用名为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服务启动)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM