gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:12:21 24 4
gpt4 key购买 nike

我有 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 文件中称为“应用程序”

所以keycloak,“sso”服务,需要一段时间来部署。我希望在“sso”服务启动后部署我的“应用程序”。
关于我的配置要记住的一件事是,“sso”启动端口 8080 的速度非常快,但需要时间才能将所有 keycloak-realms 设置到位。

这是我在“应用程序”-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') 等待它被部署,然后我启动 '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)。您必须删除与 wait-for-it.sh 相关的任何内容从相关的 Dockerfile 中,然后重建这些图像。

4)。启动撰写
docker-compose run --rm waitforsso
docker-compose up -d sso db api ws proxy ui

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

关于java - Docker、Dockerfile 和在我开始下一个服务之前使用等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com