当前位置: 首页 > 知识库问答 >
问题:

需要帮助确定为什么docker compose试图在构建依赖项之前启动依赖容器

鄢晔
2023-03-14

我希望有人能帮助我理解我在使用WSL2使用Docker Desktop for Windows构建多容器环境时遇到的错误(不要认为这些细节很重要,但你永远不知道)

我有一个< code>docker-compose.yml脚本,它构建了许多链接在一起的容器。通过注释和取消注释特定的容器,我可以很轻松地让它工作,但这似乎与我理解的< code>docker compose的工作方式背道而驰。

在任何人对使用<code>docker Composite wait

这是我的 docker-compose.yml 文件:

version: "3.4"

services:
  # Redis Service
  redis:
    build:
      context: .
      dockerfile: docker/redis/Dockerfile
    image: star/redis
    container_name: star_redis
    restart: unless-stopped
    tty: true
    ports:
      - "16379:6379"
    volumes:
      - redis_data:/data

  db:
    build:
      context: .
      dockerfile: docker/mysql/Dockerfile
    image: star/mysql
    container_name: star_db
    restart: unless-stopped
    tty: true
    environment:    
      RUN_INIT_FILES: ${DOCKER_RUN_MYSQL_INIT}
      SERVICE_TAGS: dev
      SERVICE_NAME: MySQL
    ports:
      - "3306:3306"
    volumes:
      - ${WEB_APP_PATH}${WEB_APP_PROJECT_PATH}/docker/mysql/init:/docker-entrypoint- initdb.d
      - star_mysql_db:/var/lib/mysql

  app:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    image: star/php
    container_name: star_app
    restart: unless-stopped
    tty: true
    environment:
      RUNNING_IN_DOCKER: 'true'
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    volumes:
      - star_laravel_data:${WEB_DESTINATION_PATH}
    depends_on:
      - redis
      - db
 
  nginx:
    build:
      context: .
      dockerfile: docker/nginx/Dockerfile
    image: star/nginx
    container_name: star_webserver
    restart: unless-stopped
    tty: true
    environment:
      RUNNING_IN_DOCKER: 'true'
    ports:
      - '80:80'
      - '443:443'
      - '8888:80'
    volumes:
      - star_laravel_data:${WEB_DESTINATION_PATH}
    depends_on:
      - db
      - app


  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: star_phpmyadmin
    environment:
      PMA_PORT: 3306
      PMA_HOST: db
      PMA_USER: ####
      PMA_PASSWORD: ######
    links:
       - db:MySQL
    ports:
       - "8090:80"
    restart: unless-stopped
    depends_on:
      - db
      - app
      - nginx

  package-installer:
    image: star/php:latest
    container_name: star_installer
    restart: on-failure
    depends_on:
      - db
      - app
      - nginx
    volumes:
      - star_laravel_data:${WEB_DESTINATION_PATH}
    environment:
      APP_ENV: local
      CONTAINER_ROLE: installer
      CACHE_DRIVER: redis
      SESSION_DRIVER: redis
      QUEUE_DRIVER: redis
      REDIS_HOST: redis

# Scheduler Service
 scheduler:
   image: star/php:latest
   container_name: star_scheduler
   restart: on-failure
   depends_on:
     - db
     - app
     - nginx
     - package-installer
   volumes:
     - star_laravel_data:${WEB_DESTINATION_PATH}
   environment:
     APP_ENV: local
     CONTAINER_ROLE: scheduler
     CACHE_DRIVER: redis
     SESSION_DRIVER: redis
     QUEUE_DRIVER: redis
     REDIS_HOST: redis

  # Queue Service
  queue:
    image: star/php:latest
    container_name: star_queue
    restart: on-failure
    logging:
      driver: local
    depends_on:
      - db
      - app
      - nginx
      - package-installer
    volumes:
      - star_laravel_data:${WEB_DESTINATION_PATH}
    environment:
      APP_ENV: local
      CONTAINER_ROLE: queue
      CACHE_DRIVER: redis
      SESSION_DRIVER: redis
      QUEUE_DRIVER: redis
      REDIS_HOST: redis

  volumes:
    star_laravel_data:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: ${WEB_APP_PATH}${WEB_APP_PROJECT_PATH}
    star_mysql_db:
    portainer_data:
    redis_data:
      driver: local

所以这是问题的关键,如果我运行它,作为一个新安装,我从docker compose得到这个响应:

[+] Running 0/3                                                                                                                                                         
 - package-installer Error                                                                                                                                              
 - scheduler Error                                                                                                                                                      
 - queue Error                                                                                                                                                          
Error response from daemon: pull access denied for star/php, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

这些容器都有一个<code>depends_on</code>字段,告诉它们至少需要首先启动其他容器,这些容器是<code>docker compose</code>尝试构建的第一个容器。对我来说,这毫无意义。它们有一个依赖_on。出于某种原因,它们使用应用程序容器创建的自定义图像来构建自己的容器。那么,如果被告知它们依赖于其他容器,并且它们位于脚本的底部,为什么它们是docker compose尝试构建的第一个容器呢?

到目前为止,我唯一可行的解决方案是:

  1. 注释掉docker compose中的包安装程序调度器队列容器。yml文件
  2. 营造环境
  3. 关闭环境
  4. 取消对软件包安装程序容器的注释
  5. 重新构建环境(因为现在自定义的<code>star/php<code>图像已经存在)
  6. 关闭环境
  7. 取消对调度程序队列容器的注释
  8. 重新构建环境…再次(因为现在已经添加了通过运行软件包安装程序添加的文件)Dockerfile)
  9. 现在我可以使用环境了

如果这只是我自己的环境,这就不是问题了,但是这个docker堆栈是为我们的开发团队设计的,以便能够使用它。有了这个安装它的策略,我必须向每个人解释如何注释和取消注释各种包以使其工作的过程。那将是一场噩梦。

根据docker文档,depends_on字段应按容器的依赖性顺序构建容器,这意味着容器应按以下顺序构建:

  1. redis
  2. db
  3. 应用程序
  4. nginx
  5. phpmyadmin
  6. 包-安装程序
  7. 队列/调度程序

同样,我并不关心它所依赖的容器是否正在运行,它只需要构建,但它似乎没有这样做,似乎(至少对于三个受影响的容器)直接跳到运行阶段,而不构建依赖项)。

任何有用的见解或提示都将受到欢迎。

共有1个答案

姚自强
2023-03-14

depends_on不会等待其他容器“就绪”后再启动,只会在它们启动后才启动。如果你需要等待服务准备就绪,请联系https://docs.docker.com/compose/startup-order/来解决这个问题。

 类似资料:
  • 问题内容: 我在多模块项目中使用依赖项时遇到麻烦。例如,当我声明模块依赖于这样的模块时(完整代码在此处): 如果我使用Maven 2 运行,则会出现以下错误: 如果我使用Maven 3,则会收到错误消息: 在后一种情况下,我特别困惑,因为我认为它应该在寻找type 而不是type 的工件。 使用maven 2或maven 3,可以通过运行进行编译。使用maven 3,我还可以通过运行进行编译。 但

  • 我正在使用android Studio学习应用程序开发。 在build.gradle页面上,我遇到了一个错误,即 “编译'com.android.support:appcompat-v7:25.2.0'”

  • 嗨, 我是Spring boot gradle项目的新手。我正在尝试用Spring boot应用程序运行flyway迁移。这就是我在gradle中设置依赖项的方式, 首先,我将依赖项添加为。这足以暴露一个终点。 然后我尝试以的方式添加flyway依赖项,它既没有抛出错误,也没有运行迁移脚本,直到我添加了依赖项。在查看了data-jpa jar的pom.xml之后,我确定了这个jar的hiberna

  • 我想知道下面是否可行以及如何实现。 我正在学习Spring boot的教程,其中提到我们可以有一个父依赖项。 然后定义没有版本号的依赖项。 这将在项目依赖项中添加依赖项版本1.5.6。释放sping-boot-starter和sping-boot-starter-web。 就像那样,我想找到什么是<代码> Spring-上下文 spring-jdbc Spring测试 谢谢!

  • 我对Python完全陌生,并尝试运行名为asammdf的库的示例代码“使用MDF工作”(代码可以在这里找到:https://asammdf.readthedocs.io/en/master/examples.html) 当我运行. py脚本时,我得到以下错误消息: 警告:根目录:信号打印需要pyqtgraph或matplotlib回溯(最后一次调用):文件“/Users/martin/Pychar

  • 我已经下载了SBT 0.3.15,我正在尝试运行它:现在,我只想运行SBT并获得提示;我还没有处于我想构建项目的阶段(尽管我希望能够很快完成)。 然而,我面临着SBT试图下载的奇怪依赖项的问题。我最初面临代理的问题,但现在好多了。SBT尝试下载的第一件事是pom。jansi项目1.11的xml及其工作原理: 它尝试下载的下一个文件是fusesource-pom-1.8。Maven central