I'm trying to figure out how to implement docker using docker-compose.yml with 2 databases imported from sql dumps.
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"
The above returns the following:
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
Basically, I'm trying to get my whole stack setup in a single docker compose file, create 2 databases and import the respective sql dumps. Anyone have any suggestions?
The answers elsewhere on this page set up a dedicated container for each database, but a single MySQL server is capable of hosting multiple databases. Whether you should is a different question, but if you want multiple databases in a single container, 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'@'%';
This works because the MySQL Docker project has an entrypoint script that will run through all files in the /docker-entrypoint-initdb.d
folder, if it exists. This is useful for setting up databases and initializing their schema and data. In docker-compose, we're using volumes
to map that virtual folder to a folder on the host system.
You're trying to bind both database containers to the same port - 3306
. Which is essentially impossible. You need to change the port-mapping for one of the databases, for example mysql
keeps 3306:3306
, and mysql2
should use 3307:3306
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With