使用 environment 控制環境變數

在說明 Port forwarding 時,有個範例是同個 image 開啟多個 container。實務上通常是更複雜的情境,比方說同個 image 開多個 container 且要使用不同的 DB 連線設定,當然這可以透過 volume 解決,但如果今天要管理上百個 container 與上百份設定,volume 的做法反而很難管理。

這時有另一個選擇是使用 --environment|-e 選項。

-e 用法很簡單,直接給 key=value 即可,它會設定到環境變數裡:

# 查看原本的 env
docker run --rm busybox env

# 給 env 設定後再看 env 的內容
docker run --rm -e DB_HOST=mysql busybox env

不同的程式語言則會有不同的方法取得環境變數,以下使用 PHP 與 node.js 為例

# PHP
docker run --rm php -r "echo getenv('DB_HOST');"
docker run --rm -e DB_HOST=mysql php -r "echo getenv('DB_HOST');"

# node.js
docker run --rm node node -e "console.log(process.env.DB_HOST)"
docker run --rm -e DB_HOST=mysql node node -e "console.log(process.env.DB_HOST)"

如何應用 environment?

直接使用 DockerHub 上的 image 作為範例,會比較有感覺。這裡用 Percona 做範例,文件裡面有提到很多 environment 可以搭配設定。

首先先示範 MYSQL_ROOT_PASSWORD,它會在 Percona 啟動的時候設定 root 帳號的密碼:

# Terminal 1
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass percona

# Terminal 2
docker run --rm -it --link db percona mysql -hdb -uroot -ppass

# MySQL 指令
show databases;

MYSQL_DATABASE 則是啟動後建立對應名稱的資料庫,注意 client 最後執行 show databases; 後的結果:

# Terminal 1
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=some percona

# Terminal 2
docker run --rm -it --link db percona mysql -hdb -uroot -ppass

# MySQL 指令
show databases;

MYSQL_USERMYSQL_PASSWORD 可以設定 root 以外的新帳號和密碼,同時給予 MYSQL_DATABASE 所有存取權限。

這裡注意 client 指令的帳號密碼跟剛不大一樣了。

# Terminal 1
docker run --rm -it --name db -e MYSQL_RANDOM_ROOT_PASSWORD=yes -e MYSQL_USER=miles -e MYSQL_PASSWORD=chou -e MYSQL_DATABASE=some percona

# Terminal 2
docker run --rm -it --link db percona mysql -hdb -umiles -pchou

# MySQL 指令
show databases;

最後的範例是,搭配連結 container 所學,使用 phpMyAdmin 連結 Percona:

# Terminal 1,使用 MYSQL_ROOT_PASSWORD 與 MYSQL_DATABASE
docker run --rm -it --name db -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=some percona

# Terminal 2
docker run --rm -it --link db -p 8080:80 phpmyadmin

指令說明

docker run

選項補充

  • -e|--env 設定該 container 的環境變數

今日自我回顧

今天的環境變數使用方法很單純,但應用可以千變萬化。上面四個範例都使用了 Percona image,搭配 Docker 的隔離特性與環境變數功能,可以同時提供四種不同設定的 container。

  • 使用 -e 設定 container 的環境變數
  • 參考 image 說明,搭配 -e 選項,改變 container 的行為