docker 编写 yaml - 命令
docker compose yaml - command
我想运行使用mysql
创建一个新数据库
这是我 docker-compose.yml
文件中的片段
mysql:
image: mysql
container_name: mysql-machine
ports:
- 3306:3306
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: mxdb
MYSQL_USER: mxdb
MYSQL_PASSWORD: mxdb
command: mysqladmin create testing_db
现在当我运行docker-compose up
我看控制台,它说
mysql_1 | mysqladmin: connect to server at 'localhost' failed
mysql_1 | error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'
mysql_1 | Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!
那么如何重写命令部分,使服务正常工作?
我想创建多个数据库。所以手动使用命令是最简单的方法。
我认为您不应该覆盖 command
来创建数据库。
在docker-compose 中,command
应该是启动docker 映像中给定服务的命令。在您的例子中,服务是 MySQL 服务器。如果您在 docker_compose.yml 中为 mysql 服务提供 command
,MySQL 服务器将永远不会启动。
您应该做的是启动 mysql
服务,然后在其中执行 运行 命令。
mysql:
image: mysql
container_name: mysql-machine
ports:
- 3306:3306
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: mxdb
MYSQL_USER: mxdb
MYSQL_PASSWORD: mxdb
启动服务:
docker-compose up
连接到它:
mysql -umxdb -pmxdb
然后创建数据库:
create database testing_db;
如果您需要自动创建此数据库,您可以将这些 SQL 命令放在一个文件中,并在需要时执行:
cat init_db.sql | mysql -umxdb -pmxdb
如果您使用 mysql 的这张图片:tutum/mysql
您可以在启动时添加您要创建的数据库的名称作为环境变量:
environment:
-ON_CREATE_DB="newdatabase"
另一个解决方案是在命令部分放置一个shell脚本。在脚本中启动 mysql 然后创建数据库并添加用户:
command : run.sh
在你的脚本上:
/usr/bin/mysqld_safe &
mysqladmin create testing_db
我认为您应该 运行 mysql 容器,然后让另一个容器进行数据导入。示例:
.credentials
MYSQL_ALLOW_EMPTY_PASSWORD=true
MYSQL_USER=mxdb
MYSQL_PASSWORD=mxdb
MYSQL_DATABASE=mxdb
运行容器:
docker run --name mydb -d --env-file .credentials mysql
如果要从文件导入数据,请创建一个新容器,link 到已经 运行ning 的容器并执行导入:
docker run --rm -t --link mydb:DB -v /path/to/dump.sql:/dump.sql mysql bash -c "mysql -h DB -u mxdb -pmxdb mxdb < /dump.sql"
如果你只想运行一个命令,使用:
docker run --rm -t --link mydb:DB mysql mysql -h DB -u mxdb -pmxdb -e "CREATE DATABASE bar"
或
docker exec -t mydb mysql -u mxdb -pmxdb -e "CREATE DATABASE bar"
我想运行使用mysql
创建一个新数据库这是我 docker-compose.yml
文件中的片段
mysql:
image: mysql
container_name: mysql-machine
ports:
- 3306:3306
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: mxdb
MYSQL_USER: mxdb
MYSQL_PASSWORD: mxdb
command: mysqladmin create testing_db
现在当我运行docker-compose up
我看控制台,它说
mysql_1 | mysqladmin: connect to server at 'localhost' failed
mysql_1 | error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'
mysql_1 | Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!
那么如何重写命令部分,使服务正常工作?
我想创建多个数据库。所以手动使用命令是最简单的方法。
我认为您不应该覆盖 command
来创建数据库。
在docker-compose 中,command
应该是启动docker 映像中给定服务的命令。在您的例子中,服务是 MySQL 服务器。如果您在 docker_compose.yml 中为 mysql 服务提供 command
,MySQL 服务器将永远不会启动。
您应该做的是启动 mysql
服务,然后在其中执行 运行 命令。
mysql:
image: mysql
container_name: mysql-machine
ports:
- 3306:3306
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: true
MYSQL_DATABASE: mxdb
MYSQL_USER: mxdb
MYSQL_PASSWORD: mxdb
启动服务:
docker-compose up
连接到它:
mysql -umxdb -pmxdb
然后创建数据库:
create database testing_db;
如果您需要自动创建此数据库,您可以将这些 SQL 命令放在一个文件中,并在需要时执行:
cat init_db.sql | mysql -umxdb -pmxdb
如果您使用 mysql 的这张图片:tutum/mysql 您可以在启动时添加您要创建的数据库的名称作为环境变量:
environment:
-ON_CREATE_DB="newdatabase"
另一个解决方案是在命令部分放置一个shell脚本。在脚本中启动 mysql 然后创建数据库并添加用户:
command : run.sh
在你的脚本上:
/usr/bin/mysqld_safe &
mysqladmin create testing_db
我认为您应该 运行 mysql 容器,然后让另一个容器进行数据导入。示例:
.credentials
MYSQL_ALLOW_EMPTY_PASSWORD=true
MYSQL_USER=mxdb
MYSQL_PASSWORD=mxdb
MYSQL_DATABASE=mxdb
运行容器:
docker run --name mydb -d --env-file .credentials mysql
如果要从文件导入数据,请创建一个新容器,link 到已经 运行ning 的容器并执行导入:
docker run --rm -t --link mydb:DB -v /path/to/dump.sql:/dump.sql mysql bash -c "mysql -h DB -u mxdb -pmxdb mxdb < /dump.sql"
如果你只想运行一个命令,使用:
docker run --rm -t --link mydb:DB mysql mysql -h DB -u mxdb -pmxdb -e "CREATE DATABASE bar"
或
docker exec -t mydb mysql -u mxdb -pmxdb -e "CREATE DATABASE bar"