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?
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 examplemysql
keeps3306:3306
, andmysql2
should use3307:3306
.docker-compose up
Connect to mysql1
Connect to mysql2
Multiple databases in a single Docker container
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:
docker/provision/mysql/init/01-databases.sql:
How does this work?
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 usingvolumes
to map that virtual folder to a folder on the host system.Just as an update to anyone else who may look into this.
I solved this by removing:
from docker-compose.yml and adding the relevant create database statements directly to the sql file being passed to docker-entrypoint-initdb.d.
At that stage, sql commands are performed under root, so you'll also need to add a statement to grant relevant permissions to the database user you want to use.