others - docker-compose多数据库

75 2

我正在尝试了解如何使用从sql转储导入的数据库来实现 Docker 。


httpd:


 container_name: webserver


 build:./webserver/


 ports:


 - 80:80


 links:


 - mysql


 - mysql2


 volumes_from:


 - app



mysql:


 container_name: sqlserver


 image: mysql:latest


 ports:


 - 3306:3306


 volumes:


 -./sqlserver:/docker-entrypoint-initdb.d


 environment:


 MYSQL_ROOT_PASSWORD: root


 MYSQL_DATABASE: dbname1


 MYSQL_USER: dbuser


 MYSQL_PASSWORD: dbpass



mysql2:


 extends: mysql


 container_name: sqlserver2


 environment:


 MYSQL_ROOT_PASSWORD: root


 MYSQL_DATABASE: dbname2


 MYSQL_USER: dbuser


 MYSQL_PASSWORD: dbpass



app:


 container_name: webdata


 image: php:latest


 volumes:


 -.. /php:/var/www/html


 command:"true"



以上返回以下内容:


Kronos:mybuild avanche$./run.sh 


Creating sqlserver


Creating webdata


Creating sqlserver2



ERROR: for mysql2 driver failed programming external connectivity on endpoint sqlserver2 (6cae3dfe7997d3787a8d59a95c1b5164f7431041c1394128c14e5ae8efe647a8): Bind for 0.0.0.0:3306 failed: port is already allocated


Traceback (most recent call last):


 File"<string>", line 3, in <module>


 File"compose/cli/main.py", line 63, in main


AttributeError: 'ProjectError' object has no attribute 'msg'


docker-compose returned -1



基本上,我尝试在单个 Docker 组合文件中设置整个堆栈设置,创建 2个数据库并导入相应的sql转储。 有人有什么建议吗?

时间:

145 4

你正在尝试将两个数据库容器绑定到同一端口- 3306 。 这肯定不可能。你需要更改一个数据库的端口映射,例如 mysql 保留 3306:3306mysql2 应该使用 3307:3306

51 2

我通过删除:


MYSQL_DATABASE: dbname 



从 docker-compose.yml 并直接向传递到 docker-entrypoint-initdb.d的sql文件添加相关的创建数据库语句。

在该阶段 , sql命令在 root 下执行,因此你还需要添加一个语句以向你要使用的数据库用户授予相关权限 。

77 5

单个 Docker 容器中的多个数据库

这个页面的其他地方的答案为每个数据库设置了专用容器,但是单个MySQL服务器能够承载多个数据库。 你是否是一个不同的问题, 但是如果你想在一个容器中有多个数据库,那么这就是一个例子

docker-compose.yml:


version: '3'



volumes:


 db:


 driver: local



 services:


 db:


 image: mysql:5.7


 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci


 volumes:


 -./docker/provision/mysql/init:/docker-entrypoint-initdb.d


 environment:


 MYSQL_ROOT_PASSWORD: local



docker/provision/mysql/init/01-databases.sql :


-- create databases


CREATE DATABASE IF NOT EXISTS `primary`;


CREATE DATABASE IF NOT EXISTS `secondary`;



-- create root user and grant rights


CREATE USER 'root'@'localhost' IDENTIFIED BY 'local';


GRANT ALL ON *.* TO 'root'@'%';



工作方式

这是因为 MySQL Docker 项目有一个入口点脚本它将运行 /docker-entrypoint-initdb.d 文件夹中的所有文件(如果存在 这对于建立数据库和初始化它们的模式和数据非常有用。 在docker中,我们使用 volumes 将那个虚拟文件夹映射到主机系统上的一个文件夹。

...