我有以下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
它按预期工作。更多信息here和here。
关于docker - docker-compose:在 `php-fpm`结束之前,有什么方法可以阻止 `db`启动吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886134/