Docker、Dockerfile和使用,在我开始下一个服务之前等待它



我有两个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服务启动)

相关内容

最新更新