docker - docker-compose:在 `php-fpm`结束之前,有什么方法可以阻止 `db`启动吗?

标签 docker docker-compose

我有以下docker-compose.yml文件:

version: '2'
services:
    db:
        image: mysql
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
        volumes:
            - sql_data:/var/lib/mysql
    httpd:
        build: docker/httpd
        ports:
            - "80:80"
        volumes_from:
            - php-fpm
    php-fpm:
        build: docker/php-fpm
        depends_on:
            - db
volumes:
    sql_data:
        external: true

容器php-fpm应该运行一些脚本来创建模式,并且仅在db已启动并且数据库已成功创建的情况下才加载假数据。当前docker-compose up -d --build --force-recreate正在执行以下操作:
  • 使用默认驱动程序
  • 创建网络dockerpyrocms_default
  • 建筑物php-fpm
  • 建筑物httpd
  • 创建dockerpyrocms_db_1
  • 创建dockerpyrocms_php-fpm_1
  • 创建dockerpyrocms_httpd_1

  • 但是由于尚未创建数据库,因此dockerpyrocms_php-fpm_1退出并带有代码`,原因是它可以连接到数据库:
    php-fpm_1  |   [Illuminate\Database\QueryException]   
    php-fpm_1  |   SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = pyrocms and table_name = default_migrations)  
    php-fpm_1  |   [Doctrine\DBAL\Driver\PDOException]
    php-fpm_1  |   SQLSTATE[HY000] [2002] Connection refused
    

    显然,“depends_on”是没有用的,因为Docker不知道容器何时“就绪”,它只知道容器何时启动。

    我可以就此获得一些建议吗?有关如何解决此问题的任何想法?

    这是带有文件和说明的the repo

    Note: Such problem only happen if MySQL image was already pulled and there wasn't any changes. If you run this for first time then it'll works if you run in a second time it will fails.

    最佳答案

    我在Docker Compose本身中找到了它:

    With Compose 1.10, it is now possible to indicate you want a dependency to wait for another container to be “healthy” (i.e. its healthcheck advertises a successful state) before starting.



    例如:
    version: '2.1'
    services:
      web:
        build: .
        depends_on:
          db:
            condition: service_healthy
          redis:
            condition: service_started
      redis:
        image: redis
      db:
        image: redis
        healthcheck:
          test: "exit 0"
    

    现在我的docker-compose.yml看起来像:
    version: '2.1'
    services:
        db:
            image: mysql
            healthcheck:
                test: "exit 0"
            environment:
                MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
                MYSQL_DATABASE: ${MYSQL_DATABASE}
                MYSQL_USER: ${MYSQL_USER}
                MYSQL_PASSWORD: ${MYSQL_PASSWORD}
            volumes:
                - sql_data:/var/lib/mysql
        httpd:
            build: docker/httpd
            ports:
                - "80:80"
            volumes_from:
                - php-fpm
        php-fpm:
            build: docker/php-fpm
            depends_on:
                db:
                    condition: service_healthy
    volumes:
        sql_data:
            external: true
    

    它按预期工作。更多信息herehere

    关于docker - docker-compose:在 `php-fpm`结束之前,有什么方法可以阻止 `db`启动吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886134/

    相关文章:

    c# - VS2019 中的 Azure IoT 解决方案仅适用于系统重启后的首次运行

    postgresql - 如何备份PostgreSQL的docker卷?

    docker - 增加 docker-compose 容器的堆大小

    docker - 在 Docker 中混合命名卷和绑定(bind)挂载?

    docker - Docker撰写运行在入口点引发错误

    docker - 如何创建Docker覆盖网络?

    docker - EPERM : operation not permitted, 在 Windows 中打开 '/app/yarn-error.log'

    ubuntu - 绕过 dockerfile 中的安装配置

    docker - 无法通过Travis CI将多容器应用程序部署到Heroku

    mysql - 无法在 Docker-Compose 文件中将本地数据库映射到(mysql 镜像中的卷)