我正在控制容器的启动顺序,因为我的docker-compose共有5个容器,它们需要按顺序启动。
我已经遍历了Internet / git / StackOverflow解决方案中有关控制启动顺序的许多建议。
问题是
容器启动时,命令:[“ ./wait-for-it.sh”,“ rabbitmq:15672”]
在docker容器内未执行。
这是详细说明:
我有一个spring boot项目,下面有Dockerfile。
FROM openjdk:8-jre-alpine
COPY ./target/spring-cloud-config-server-0.0.1-SNAPSHOT.jar /usr/source/
COPY wait-for-it.sh /usr/source/
RUN chmod 777 /usr/source/wait-for-it.sh
RUN apk add --no-cache bash
WORKDIR /usr/source/
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "spring-cloud-config-server-0.0.1-SNAPSHOT.jar"]
2。我正在使用wait-for-it.sh bash脚本,该脚本直接放置在存在Dockerfile的同一根目录中。 3.在同一个根目录中,有如下所示的docker-compose.yml
version: "3.3"
services:
rabbitmq:
image: rabbitmq:management
ports:
- "15672:15672"
- "5672:5672"
volumes:
- /root/rabbitmq_data:/var/lib/rabbitmq
spring-cloud-config-server:
image: rajeevshukla/spring-cloud-config-server
container_name: spring_cloud_config_server
depends_on:
- rabbitmq
links:
- rabbitmq
command: ["./wait-for-it.sh","rabbitmq:15672"]
ports:
- "8888:8080"
environment:
- "SPRING_PROFILES_ACTIVE=prod"
现在,当我构建docker镜像并启动它时。我看到在我的jar文件所在的/ usr / source /目录中的docker容器中存在wait-for-it.sh。
我跑步时
docker-compose up
我期望一旦Rabbitmq服务器启动,那么spring-cloud-config-server应该会启动。但这实际上并没有发生。 即使我在 command 中运行任何命令,它也不会执行。我已经尝试了所有可能的情况,但是没有运气。
据我所知,command: ["./wait-for-it.sh","rabbitmq:15672"]
在容器启动时被执行。那它在ENTRYPOINT ["java", "-jar", "spring-cloud-config-server-0.0.1-SNAPSHOT.jar"]
之前执行吗?
感谢您的帮助。
答案 0 :(得分:6)
通过执行一个二进制文件来启动容器,并且当该可执行文件退出时,容器本身就会退出。因此,在容器上定义入口点和命令时,结果是将命令作为参数传递给入口点。在这种情况下,您的入口点需要知道如何处理命令中的自动参数。您不会得到一个运行两个命令的容器。
典型用法是使入口点成为执行任何初始化步骤的脚本,例如wait-for-it
命令。然后,最后一行通常是exec "$@"
,它用"$@"
定义的新可执行文件替换pid 1中的入口点脚本,这是命令行参数。