2017-04-10 48 views
1

我想在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" 

有人可以解釋這個變量的功能嗎?

回答

3

對於第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文件嗎? –

4

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

0

還有一個選項可以爲每個創建容器時應用的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 (...); 
0

如果我理解你的問題正確,你想有一個與它特定數據庫的容器。就像已經執行了一個有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目錄並把你的初始化腳本放在那裏。

0

回答你的問題......

有一件事我用建立一個新的泊塢窗容器時做的是瞭解我從拉圖像也時建造。

在您的碼頭工人,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 
相關問題