我有一些 spring boot 微服务。我想使用 docker compose 运行它们。为了确保服务按顺序运行,我使用 .sh 文件在其他服务之前运行其中一个,因为其他微服务依赖于它。bash 脚本文件运行良好,但它会停止调用者容器。我在互联网上搜索并意识到必须在 bash 脚本文件末尾添加一些命令:/cnb/process/web
或./cnb/lifecycle/launcher
才能继续该过程。但显示此消息: /cnb/process/web: No such file or directory
。
Spring Boot 版本:3.2.2
Docker 撰写:3.8
.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
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:
将此行附加到 .sh 文件的末尾,
tail -f /dev/null
因为当您的 .sh 退出时,没有任何东西可以保持 docker 容器运行。您可以使用另一个等效命令。请参阅https://kodekloud.com/blog/keep-docker-container-running/您应该使用 compose 中提供的设施,而不是重新发明它们。depends on可以选择
service_healthy
检查您所依赖的服务是否健康。您可能需要对您的服务进行健康检查,但这对于您来说并不重要。我遇到过同样的问题。我的意思是通过添加
/cnb/process/web
到 .sh 文件来在执行 .sh 文件后保持容器运行。问题似乎源于您创建 docker 镜像的方式。在 docker compose 文件中,而不是使用build:
dockerfile: ./Dockerfile
我通过添加以下代码使用 spring boot pom.xml 创建 docker 镜像:
然后
mvn clean install
创建一个图像。之后你可以参考docker compose中的图像:
而不是