mysql - 使用 docker-compose.yml 文件的 docker 内部的 Mura CMS 数据库连接问题

标签 mysql docker docker-compose mura

我正在尝试在本地计算机上使用 Docker 设置 Mura CMS。 MYSQL 数据库似乎无法正常工作。

我正在使用 docker-compose up 命令。我一直在尝试以下示例: https://github.com/blueriver/docker-muracms/tree/master/examples/blueriver-muracms-mysql

version: '3.3'

services:

  muracms:
    image: blueriver/muracms:latest
    depends_on:
      - svc_muradb
    environment:
      MURA_ADMIN_USERNAME: admin
      MURA_ADMIN_PASSWORD: 5trongP@55w0rd
      MURA_ADMINEMAIL: youremail@domain.com
      MURA_APPRELOADKEY: appreload
      MURA_DATASOURCE: dsn_muracms
      MURA_DATABASE: muradb
      MURA_DBTYPE: mysql
      MURA_DBUSERNAME: root
      MURA_DBPASSWORD: 5trongP@55w0rd 
      MURA_DBHOST: svc_muradb
      MURA_DBPORT: 3306
      MURA_SITEIDINURLS: "false"
      MURA_INDEXFILEINURLS: "true"
      MURA_TESTBOX: "true"
      MURA_USESSL: "false"
    volumes:
      - ./www/modules:/var/www/modules
      - ./www/plugins:/var/www/plugins
      - ./www/sites:/var/www/sites
      - ./www/themes:/var/www/themes
    ports:
      - "8888:8888"

  # DB
  svc_muradb:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: muradb
      MYSQL_ROOT_PASSWORD: 5trongP@55w0rd
    volumes:
      - vol_muradb:/var/lib/mysql
    ports:
      - "5001:3306"

# Mounts
volumes:
  vol_muradb:

当我浏览 localhost:8888 时看到以下错误消息:

500 Error
Could not create connection to database server.
Code:0
Type:database
lucee.runtime.exp.DatabaseException: Could not create connection to database server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)

最佳答案

这是因为当muracms启动时,svc_muradb还没有完成它的初始化。

depends_on 只是确保svc_muradb 先启动,然后再启动muracms。但是启动进程svc_muradb是异步的。所以在 svc_muradb 准备好之前,你的 muracms 很可能已经想要连接数据库了。

此问题记录在 official guide 中,建议您为 svc_muradb 命令编写一个包装器。

像下面这样,我只是举个例子:

docker-compose.yml:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres

wait-for-it.sh:

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd 

使用上述解决方法,Web 容器将运行 wait-for-it.sh,首先它会尝试链接其依赖容器 db:5432,只有在它确认可以使用psql 客户端 链接到数据库,然后它将运行真正的命令python app.py

你这边,你需要修改mysql client test相关的,然后就ok了。

关于mysql - 使用 docker-compose.yml 文件的 docker 内部的 Mura CMS 数据库连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140597/

相关文章:

docker - gitlab ci 无法构建 windows 容器

apache - 为什么我收到错误 "You don' t have permission to access/on this server."?

postgresql - 如何通过 docker-compose 网络连接到 postgres?

mysql - SQL 将延迟分钟的时间值更改为 "previous"分钟

mysql - 如何将数据加载到不带空格的 MySQL 表中?

docker - 如何在docker文件中转义#

docker - Jenkins windows docker 运行镜像失败,工作目录无效,必须是绝对路径

docker - 如何在Linux上运行Visual Studio 2019生成的Dockered ASP.net核心应用程序? SSL配置问题

php - MySQL 和 PHP 根据表中的值删除表

java - 除了 Asc/Desc,还有其他使用 Mysql Order By 的方式吗?