docker compose:是否有任何方法可以防止在'db'结束之前启动'php fpm'?

docker compose:是否有任何方法可以防止在'db'结束之前启动'php fpm'?,docker,docker-compose,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}

我有以下
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
已经启动并且db已经成功创建的情况下,才能加载假数据。目前,
docker compose up-d--build--force recreate
正在执行以下操作:

  • 使用默认驱动程序创建网络
  • 建筑
    php fpm
  • 建筑
    httpd
  • 创建
    dockerpyrocms\u db\u 1
  • 创建
    dockerpyrocms\u php-fpm\u 1
  • 创建
    dockerpyrocms\u httpd\u 1
但由于数据库尚未创建为该点,因此,
dockerpyrocms\u php-fpm\u 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
显然,“depens__on”有点无用,因为Docker不知道容器何时“准备就绪”,它只知道容器何时启动

我能得到一些建议吗?关于如何解决这个问题有什么想法吗

这里有文件和说明

注意:只有在MySQL映像已经被拉取并且没有任何更改的情况下,才会出现这种问题。如果你第一次运行它,那么它会工作,如果你第二次运行它就会失败

你可以用

sh是一个纯bash脚本,它将等待主机和TCP端口的可用性。它对于同步相互依赖的服务(如链接的docker容器)的加速非常有用。因为它是一个纯bash脚本,所以它没有任何外部依赖关系

如何使用? 添加到php fpm容器中。
entrypoint
可以类似于以下脚本:

wait-for-it.sh db:3306 -t 60
# some code interacted with database 
# will executed only when database is started up

我在Docker Compose中找到了它:

使用Compose 1.10,现在可以指示您需要 等待另一个容器“健康”(即其 开始前,healthcheck会播发成功状态)

例:

现在我的
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

它的工作原理与预期一致。更多信息和。

我是否正确理解“如何强制php等待数据库启动”的问题?@BukharovSergey有点像,但这是正确的,不再有效:“版本3不再支持依赖于的条件形式。在swarm模式下使用版本3的撰写文件部署堆栈时,将忽略依赖于选项。”现在可以找到Richard提到的文档。
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