docker-compose 与多个数据库

新手上路,请多包涵

我试图弄清楚如何使用 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 转储。有人有什么建议吗?

原文由 Avanche 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 666
2 个回答

就像对可能调查此问题的其他任何人的更新一样。

我通过删除解决了这个问题:

 MYSQL_DATABASE: dbname

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

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

原文由 Avanche 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

本页其他地方的答案为每个数据库设置了一个专用容器,但单个 MySQL 服务器能够托管多个数据库。是否应该 是一个不同的问题,但如果你想在一个容器中使用多个数据库, 这里有一个例子

码头工人-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 项目 有一个 入口点脚本,该脚本将运行 /docker-entrypoint-initdb.d 文件夹中的所有文件(如果存在)。这对于设置数据库和初始化它们的模式和数据很有用。在 docker-compose 中,我们使用 volumes 将该虚拟文件夹映射到主机系统上的文件夹。

原文由 mahemoff 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题