Tenho alguns microsserviços spring boot. Quero executá-los usando o docker compose. Para ter certeza de que os serviços são executados em ordem, usei um arquivo .sh para executar um deles antes dos outros porque outros microsserviços dependem dele. O arquivo de script bash roda muito bem, mas ele para o contêiner do chamador. Pesquisei na Internet e percebi que alguns comandos devem ser adicionados no final do arquivo de script bash: /cnb/process/web
or ./cnb/lifecycle/launcher
para continuar o processo. Mas esta mensagem é exibida: /cnb/process/web: No such file or directory
.
Versão do Spring Boot: 3.2.2
Docker compose: 3.8
arquivo .sh:
#!/bin/bash
# check-config-server-started.sh
apt-get update -y
yes | apt-get install curl
curlResult=$(curl -s -o -I -w "%{http_code}" http://cloud-config-server:8888/actuator/health)
echo "result status code:" "$curlResult"
while [[ ! $curlResult == "200" ]]; do
>&2 echo "Config server is not up yet!"
sleep 2
curlResult=$(curl -s -o -I -w "%{http_code}" http://cloud-config-server:8888/actuator/health)
done
/cnb/process/web
#./cnb/lifecycle/launcher
Arquivo de composição do Docker:
version: "3.8"
services:
cloud-config-server:
container_name: cloud-config-server-container
build:
dockerfile: ./cloud-config-server/Dockerfile
ports:
- "8888:8888"
environment:
- "SERVER_PORT=8888"
networks:
my-compose-net:
restart: on-failure
webapp:
container_name: webapp-container
build:
dockerfile: ./webapp/Dockerfile
ports:
- "8081:8081"
volumes:
- "./check-config-server-started.sh:/usr/local/bin/check-config-server-started.sh"
user: root
entrypoint: [ "check-config-server-started.sh" ]
environment:
- "SPRING_CLOUD_CONFIG_URI=http://cloud-config-server:8888"
depends_on:
- cloud-config-server
networks:
my-compose-net:
restart: on-failure
networks:
my-compose-net:
Adicione esta linha ao final do seu arquivo .sh
tail -f /dev/null
Porque quando seu .sh sai, nada mantém o contêiner docker em execução. Você pode usar outro comando equivalente. Veja https://kodekloud.com/blog/keep-docker-container-running/Você deve usar os recursos disponíveis no compose em vez de reinventá-los. Depende de tem a opção
service_healthy
de verificar se o serviço do qual você depende é saudável. Você pode precisar fornecer uma verificação de saúde em seu serviço, mas isso seria trivial no seu caso.Eu enfrentei o mesmo problema. Quero dizer, manter os contêineres em execução após executar arquivos .sh adicionando
/cnb/process/web
ao arquivo .sh. Parece que o problema se origina da maneira como você cria sua imagem do docker. No arquivo docker compose, em vez de usarbuild:
dockerfile: ./Dockerfile
Eu crio imagens docker usando spring boot pom.xml adicionando estes códigos:
então
mvn clean install
para criar uma imagem.depois disso você pode consultar a imagem no docker compose:
em vez de