gpt4 book ai didi

database - docker-compose 与多个数据库

转载 作者:IT老高 更新时间:2023-10-28 12:42:50 26 4
gpt4 key购买 nike

我试图弄清楚如何使用 docker-compose.yml 和从 sql 转储导入的 2 个数据库来实现 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 compose 文件中设置我的整个堆栈,创建 2 个数据库并导入各自的 sql 转储。有人有什么建议吗?

最佳答案

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

本页其他地方的答案为每个数据库设置了一个专用容器,但单个 MySQL 服务器能够托管多个数据库。是否应该is a different question ,但如果你想在一个容器中拥有多个数据库,here's an example .

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 PRIVILEGES ON *.* TO 'root'@'%';

这是如何工作的?

这是因为 MySQL Docker project有一个 entrypoint script这将遍历 /docker-entrypoint-initdb.d 文件夹中的所有文件(如果存在)。这对于设置数据库和初始化它们的模式和数据很有用。在 docker-compose 中,我们使用 volumes 将该虚拟文件夹映射到主机系统上的文件夹。

关于database - docker-compose 与多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39204142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com