【问题标题】:Command does not execute inside docker-compose.yml命令不在 docker-compose.yml 中执行
【发布时间】:2019-01-23 05:46:24
【问题描述】:

我正在控制容器的启动顺序,因为我的docker-compose.yml 共有 5 个容器,它们需要按顺序启动。

我浏览了网上很多关于控制启动顺序的建议。

问题是

命令:["./wait-for-it.sh","rabbitmq:15672"]

容器启动时没有在 Docker 容器内执行。

这里有详细的说明:

  1. 我有一个 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 映像并启动它时。我看到 wait-for-it.sh 存在于 Docker 容器中,位于我的 jar 文件所在的 /usr/source/ 目录中。

当我跑步时

码头工人组成

我期待一旦 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"] 之前执行吗?

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

容器是通过执行单个二进制文件启动的,当该可执行文件退出时,容器本身也会退出。因此,当您在容器上同时定义入口点和命令时,结果是将命令作为参数传递给入口点。在这种情况下,您的入口点需要知道如何处理来自命令的自动参数。你不会得到一个运行两个命令的容器。

典型的用法是使入口点成为执行任何初始化步骤的脚本,例如wait-for-it 命令。最后一行通常是exec "$@",它将 pid 1 中的入口点脚本替换为由"$@" 定义的新可执行文件,即命令行参数。

【讨论】:

  • docker ps --no-trunc 有助于查看完整的命令运行,例如就我而言,很明显我的 docker-compose 命令现在是原始入口点的 arg:"/entrypoint.sh /bin/sh -c 'echo 'foo' > /bar".
  • @BMitch 你有一个示例如何将wait-for-it 作为命令运行,然后从image 运行可执行文件吗?
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多