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