在docker-compose启动时创建数据库
我想在docker-compose.yml文件中使用环境变量创建一个MySQL数据库,但它不起作用。我有以下代码:在docker-compose启动时创建数据库
# The Database
database:
image: mysql:5.7
volumes:
- dbdata:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: homestead
MYSQL_USER: root
MYSQL_PASSWORD: secret
ports:
- "33061:3306"
有人可以解释这个变量的功能吗?
对于第2版搬运工,谱写你.yml
或.yaml
可以是这样的:
version: '2'
volumes:
dbdata:
services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- dbdata:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=homestead
- MYSQL_USER=root
- MYSQL_PASSWORD=secret
ports:
- "33061:3306"
与docker-compose up -d
启动,并检查:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3567fb78d0d mysql:5.7 "docker-entrypoint..." 2 minutes ago Up 2 minutes 0.0.0.0:33061->3306/tcp mysql
docker exec -it a3567fb78d0d bash
[email protected]:/# mysql -u root -p homestead
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.17 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| homestead |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
你的量将在坚持码头容积nameoffolder_dbdata
(/var/lib/docker/volumes/...
)
Th e数据库可能已经初始化并且配置存储在/var/lib/mysql
中。由于您为该位置定义了卷,配置将在重新启动后存活。 MySQL映像不会一遍又一遍地重新配置数据库,它只会这样做一次。
volumes: - dbdata:/var/lib/mysql
如果你的数据库是空的,你可以通过执行docker-compose down -v
重置数据库所在的-v
删除卷中的部分定义的卷。见https://docs.docker.com/compose/reference/down/。在下一个docker-compose up
上,MySQL映像将重新启动,并使用您通过环境部分提供的配置初始化数据库。
噢!非常感谢你,它一定是因为现在它从env获得价值。瓦尔。 – Pedrog
还有一个选项可以为每个创建容器时应用的mysql
容器提供init文件。
database:
image: mysql:5.7
ports:
- "33061:3306"
command: --init-file /data/application/init.sql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: homestead
MYSQL_USER: root
MYSQL_PASSWORD: secret
这样的文件可能包含您最初的数据库结构和数据 - 例如:
CREATE DATABASE IF NOT EXISTS dev;
CREATE DATABASE IF NOT EXISTS test;
USE dev;
CREATE TABLE IF NOT EXISTS (...);
如果我理解你的问题正确,你想有一个与它特定数据库的容器。就像已经执行了一个有CREATE DATABASE mydb
等的MySQL容器。如果是这样你需要使用docker-entrypoint-initdb.d
: https://docs.docker.com/samples/library/mysql/#docker-secrets
当官方的MySQL容器第一次启动时,首先会创建一个新的数据库。然后它将执行在/docker-entrypoint-initdb.d
中找到的具有扩展名.sh,.sql和.sql.gz的文件。所以你所要做的就是创建/docker-entrypoint-initdb.d
目录并把你的初始化脚本放在那里。
回答你的问题......
有一件事我用建立一个新的泊坞窗容器时做的是了解我从拉图像也时建造。
在您的码头工人,compose.yml土特产品有这个
# The Database
database:
image: mysql:5.7
这是你从“MySQL的拉图像:5。7"
Dockerhub是一个仓库,在这里您可以找到这个图像的信息
做谷歌搜索。 “MySQL的:5.7 dockerhub”
第一个结果是https://hub.docker.com/_/mysql/
有你有你的形象5.7,如果你点击5.7你有这样的
https://github.com/docker-library/mysql/blob/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7/Dockerfile
是哪个来自图像的Dockerfile,您可以查看构建图像时发生的有趣事情。
其中之一,这是入口点[“docker-entrypoint.sh”]
这是得到了执行该文件时的图像准备
我你去上一级的回购,你会看到这文件
https://github.com/docker-library/mysql/tree/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7
的,你可以看到使用环境变量来创建新的数据库等等
file_env 'MYSQL_DATABASE'
if [ "$MYSQL_DATABASE" ]; then
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
mysql+=("$MYSQL_DATABASE")
fi
这不完全是我问,但它很有趣。我想知道envinronment vars是否也会创建数据库。因为在docker-compose.yml图中是数据库名称,为什么? – Pedrog
我并不完全理解你的回答/问题,但是,env var正在创建一个名为homestead的数据库。当我执行演出数据库时检查我的答案。你看到了宅基地数据库,我也在那个数据库上进行身份验证(-p) – lvthillo
我已经有了容器。我想为容器创建数据库。你能告诉我如何为容器创建docker-compose文件吗? –