我试图弄清楚如何使用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转储。有人有什么建议吗?
您正在尝试将两个数据库容器绑定到同一个端口 - 3306
。这基本上是不可能的。您需要更改其中一个数据库的端口映射,例如mysql
保留3306:3306
,mysql2
应使用3307:3306
。
正如对可能会对此进行调查的任何其他人的更新。
我解决了这个问题:
MYSQL_DATABASE: dbname
来自docker-compose.yml并将相关的create database语句直接添加到传递给docker-entrypoint-initdb.d的sql文件中。
在该阶段,sql命令在root下执行,因此您还需要添加一个语句,以向您要使用的数据库用户授予相关权限。
此页面上其他地方的答案为每个数据库设置了一个专用容器,但是一个MySQL服务器能够托管多个数据库。你是否应该is a different question,但如果你想在一个容器中的多个数据库,here's an example。
码头工人,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
泊坞窗/拨备/ 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
将该虚拟文件夹映射到主机系统上的文件夹。
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
之后mysql -h localhost -uasdf -P 3307 -pasdf asdf --protocol=tcp -D asdf
mysql -h localhost -uasdf -P 3308 -pasdf asdf --protocol=tcp -D asdf