docker-compose с несколькими базами данных

Я пытаюсь выяснить, как реализовать docker с помощью docker-compose.yml с 2 базами данных, импортированных из SQL-дампов.

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. У кого-нибудь есть предложения?

3 ответов


вы пытаетесь привязать оба контейнера базы данных к одному порту -3306. Что, в сущности, невозможно. Необходимо изменить сопоставление портов для одной из баз данных, например mysql держит 3306:3306 и mysql2 должны использовать 3307:3306.


Так же, как обновление для всех, кто может заглянуть в это.

Я решил это, удалив:

MYSQL_DATABASE: dbname 

С докер-сочинять.в формате YML и добавление соответствующих инструкций create database непосредственно в файл sql, передаваемый в docker-entrypoint-initdb.d.

на этом этапе команды sql выполняются под root, поэтому вам также нужно добавить инструкцию для предоставления соответствующих разрешений пользователю базы данных, которого вы хотите использовать.


version: '3'
services:
  mysql1:
    image: mysql:5.6.26
    environment:
     MYSQL_ROOT_PASSWORD: asdf
     MYSQL_USER: asdf
     MYSQL_HOST: localhost
     MYSQL_PASSWORD: asdf
     MYSQL_DATABASE: asdf
    ports:
      - "3307:3306"
  mysql2:
    image: mysql:5.6.26
    environment:
     MYSQL_ROOT_PASSWORD: asdf
     MYSQL_USER: asdf
     MYSQL_HOST: localhost
     MYSQL_PASSWORD: asdf
     MYSQL_DATABASE: asdf
    ports:
      - "3308:3306"
  • после docker-compose up
  • подключение к mysql1

    mysql -h localhost -uasdf -P 3307 -pasdf asdf --protocol=tcp -D asdf
    
  • подключение к mysql2

    mysql -h localhost -uasdf -P 3308 -pasdf asdf --protocol=tcp -D asdf