使用docker-compose.yml中的命令等待docker容器准备就绪

使用docker-compose.yml中的命令等待docker容器准备就绪,docker,docker-compose,startup,Docker,Docker Compose,Startup,我在docker-compose.yml中有一个mysql db和prisma映像。我希望prisma等待db准备就绪,否则prisma会继续重新启动,并且根本无法工作。从中我知道,我可以使用,但在搜索了一段时间后,我无法连接这些片段 version: '3' services: prisma: image: prismagraphql/prisma:1.25 restart: unless-stopped ports: - "4001:4466" d

我在docker-compose.yml中有一个mysql db和prisma映像。我希望prisma等待db准备就绪,否则prisma会继续重新启动,并且根本无法工作。从中我知道,我可以使用,但在搜索了一段时间后,我无法连接这些片段

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.25
    restart: unless-stopped
    ports:
    - "4001:4466"
    depends_on:
    - db

    # I added this command
    command: ["./wait-for-it.sh", "db:33061", "--"] 

    environment:
      PRISMA_CONFIG: |
        managementApiSecret: server.secret.123
        port: 4466
        databases:
          default:
            connector: mysql
            active: true
            host: db
            port: 3306
            user: ***
            password: ***
  db:
    image: mysql:5.7
    restart: unless-stopped
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: ***
      MYSQL_ROOT_PASSWORD: ***
    ports:
      - "33061:3306"
    volumes:
      - /docker/mysql:/var/lib/mysql
我在上面添加了命令,但没有任何更改,日志中甚至没有错误,但据我所知,该命令在容器中运行

  • 如何将./wait-it.sh放入容器?
  • 这是否可以通过命令以这种方式工作,或者这取决于 在prisma图像上?
  • 否则,我如何实现等待?

  • 我只是有docker compose文件,想做docker compose up-d

    你把内部端口和外部端口搞混了。数据库在网络中的端口
    3306
    上可见,因此您必须等待
    db:3306
    ,而不是等待
    33061

    端口公开在用户定义的网桥网络内不起作用,默认情况下由
    docker compose
    创建。默认情况下,网络内的容器可以看到所有端口。当您暴露端口时,将其显示在网络外部

    另外,请确保图像的
    prismagraphql/prisma:1.25的
    入口点是什么。如果它不是
    /bin/sh-c
    或其他类型的shell,则不会执行
    命令

    UPD 如果在基本图像中获得的
    入口点与
    /bin/sh-c
    不同,则可以覆盖它。假设您有
    /bin/sh-c/app/start.sh
    ,您可以执行以下魔术:

    docker compose.yml

    ...
    services:
      prisma:
        entrypoint: ["/bin/sh", "-c", "'./wait-for-it.sh db:3306 && /app/start.sh'"] 
    

    现在我知道了如何将
    wait.sh
    包含到容器中

    我将wait-for-it.sh下载到项目文件夹中,然后创建了一个名为Dockerfile的文件,其中包含以下内容:

    FROM prismagraphql/prisma:1.25
    COPY ./wait-for-it.sh /app/wait-for-it.sh
    RUN chmod +x /app/wait-for-it.sh
    ENTRYPOINT ["/bin/sh","-c","/app/wait-for-it.sh db:3306 -t 30 -- /app/start.sh"]
    
    在我的docker-compose.yml中,我替换了
    image:prismagraphql/prisma:1.25
    带有
    build:。
    这会导致从我的项目路径中的Dockerfile生成新版本


    现在,新映像将从prisma映像构建,wait-it.sh将复制到新映像中。然后,入口点被覆盖,prisma将等待数据库准备就绪。

    好的,谢谢。我通过portainer发现
    /bin/sh-c/app/start.sh
    是图像的入口点。那么我的命令会被执行吗?视情况而定。您将以
    /bin/sh-c/app/start.sh./wait-for-it.sh db:33061--
    的形式获得整个命令。因此,根据
    start.sh
    的内容,您可以执行脚本,也可以不执行脚本,因为它似乎覆盖了入口点。我现在的问题是,我不知道如何让
    等待它。sh
    工作,因为我不知道如何将它放入容器中以便在那里执行。不应该
    /wait-it.sh db:33061
    be
    /wait-it.sh db:3306
    这是我文章前半部分的主题)