在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/...

+0

这不完全是我问,但它很有趣。我想知道envinronment vars是否也会创建数据库。因为在docker-compose.yml图中是数据库名称,为什么? – Pedrog

+1

我并不完全理解你的回答/问题,但是,env var正在创建一个名为homestead的数据库。当我执行演出数据库时检查我的答案。你看到了宅基地数据库,我也在那个数据库上进行身份验证(-p) – lvthillo

+0

我已经有了容器。我想为容器创建数据库。你能告诉我如何为容器创建docker-compose文件吗? –

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映像将重新启动,并使用您通过环境部分提供的配置初始化数据库。

+0

噢!非常感谢你,它一定是因为现在它从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.dhttps://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