【问题标题】:How to run one server docker container before client container如何在客户端容器之前运行一个服务器 docker 容器
【发布时间】:2021-08-12 02:13:11
【问题描述】:

我有一个相当复杂的应用程序,我在客户端有下一个 js,在后端我有 graphql,我有 nginx 作为反向代理。

我正在索引页面上使用下一个 JS 增量静态站点重新生成功能,这就是为什么我希望我的服务器在我的客户端容器开始构建之前启动并运行,因为当我运行 npm run build 时,它将从 graphql 获取一些数据这里的服务器是我的 docker compose 文件

version: "3"
services:
  mynginx:
    container_name: mynginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80

  graphql:
    container_name: graphql_server
    depends_on:
      - mynginx
    build:
      context: ./server
      dockerfile: Dockerfile

  mynextjs:
    container_name: nextjs_server
    depends_on:
      - graphql
    build:
      context: ./client
      dockerfile: Dockerfile

【问题讨论】:

  • 我不清楚这种方法是否可行:Docker 映像构建永远不会连接到任何特定的 Docker 网络,并且它无法联系您的服务器,即使它确实首先启动。如果“静态”页面将通过在运行时从服务器容器中获取来增量构建,你能避免在构建时生成任何东西吗?
  • 只是让客户端失败,但是设置restart=always。客户端将继续死亡,直到服务器准备好,只有最后一个会存活。这是首选方法。
  • @Prince Tanwar,我也遇到了同样的问题,你解决了吗?

标签: node.js docker docker-compose next.js


【解决方案1】:

depends_onhealthcheck,在另一个容器已经工作时启动容器

https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

类似的东西

services:
  mynginx:
    container_name: mynginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    healthcheck:
      test: ["CMD-SHELL", "wget -O /dev/null http://localhost || exit 1"]
      timeout: 10s

  graphql:
    ...
    depends_on:
      depends_on:
        mynginx:
          condition: service_healthy

【讨论】:

    【解决方案2】:

    简单来说,你需要等到graphql服务正确启动完毕后再运行mynextjs服务。

    恐怕depends_on(或links)在这种情况下可能无法开箱即用。原因是,尽管 Compose 确实在启动 mynextjs 服务之前启动了 graphql 服务,但它不会等到 graphql 服务处于 READY 状态时才启动依赖服务。

    基本上,您需要找到一种方法告诉 Compose 等到 graphql 服务处于 READY 状态。

    解决方案在 Compose 文档中的 Control startup and shutdown order 中进行了描述

    我希望这对你有帮助。干杯? !!!

    【讨论】:

      【解决方案3】:

      如果我正确理解您的问题,您需要延迟开始构建前端容器的映像,直到后端容器运行并准备就绪。

      想到的最简单的方法是使用配置文件来允许独立启动它们。

      例如:

      version: "3"
      services:
        mynginx:
          container_name: mynginx
          build:
            context: ./nginx
            dockerfile: Dockerfile
          ports:
            - 80:80
          profiles: ["backend"]
      
        graphql:
          container_name: graphql_server
          depends_on:
            - mynginx
          build:
            context: ./server
            dockerfile: Dockerfile
          profiles: ["backend"]
      
        mynextjs:
          container_name: nextjs_server
          depends_on:
            - graphql
          build:
            context: ./client
            dockerfile: Dockerfile
          profiles: ["frontend"]
      

      然后链接开始类似:

      docker-compose --profile backend -d up && docker-compose --profile frontend -d up
      

      另一种选择可能是拆分为两个单独的撰写文件,它们之间有一个共享的 docker 网络。

      参考:https://docs.docker.com/compose/profiles/

      【讨论】:

      • 这个“docker-compose --profile backend -d up && docker-compose --profile frontend -d up”命令不起作用
      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2022-12-18
      • 2019-10-23
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多