環境変数周りのあれこれ


環境変数について調べてみた

最近業務でdocker使ってる時に、「あれ、、、AWS credentialがないって言われてる」となり、
.zsh_localには書いてるしなんでや、、となっていた時のあれこれ

結論

上記の質問については
.zsh_localはdockerは読みに行けないから、.envに書かなくちゃダメ。
ということらしい。

よくわからなかったので調べてみた

環境変数っていっぱいありますね。
僕はこういうのが一番嫌いです。環境構築とかとともに。

環境変数

環境変数とは・・・システムが必要とするさまざまな情報を保管している特別な変数。よくあるやつで、OSは何?、今のユーザ名は何?、カレントディレクトリは何?、Windowsはどこにインストールされているの?っていうやつ。PATHも環境変数のひとつ。

PATHとは・・・コマンドを実行するプログラムのある場所。コンピュータの中のすべてを探すのは、無理(可能だけれど重すぎる)ので、「探し物をするなら、ここを、この順番で」ということをメモ書きしたようなもの
http://pocketstudio.jp/linux/?%A5%D1%A5%B9(PATH)%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9

.bash_profile, .zsh_local, .zshrc, .env etc...

僕にはまず最初の2つのちがいがわからなかったw
この違いについて先に触れると、bash用の設定ファイルとzsh用の設定ファイルということ。
なので全く別物です。

そしてこれの話をするにはbashとzshの違いが必要になる。
zshは高機能bashなので、Macユーザーはzshを使いましょう、でおわる。
でもそもそもbashって何やねんと言う話になる。その前に

シェルとは・・・ユーザーの入力をカーネルに伝えまたその逆を行う、いわば両者の橋渡しを行うプログラム
bashとは・・・シェルの一つ。UNIX系で多く使われるコマンド
カーネルとは・・・Linuxの核となるもの。アプリケーションとはハードウェアの橋渡しをする役割

参考
http://d.hatena.ne.jp/ryamada/20150722/1437546385
http://blog.tokoyax.com/entry/zsh/bash-to-zsh
http://www.linuxacademy.ne.jp/lablog/infrastructure/203/
http://news.mynavi.jp/column/zsh/001/

なんか調べながら書いてたら深みにはまっていく気しかしない、、、とりあえずこれくらいにしておいて。

上記のように、bash_profileとzsh_localの違いはわかりましたと。(ものがちがうと)
そして私はzshを使ってるのでbash_profileは無視します。

zshにはいくつか設定ファイルがあるみたいで、基本的には
「.zshenv」「.zprofile」「.zshrc」「.zlogin」「.zlogout」
この5つをつかうとのこと。
これの違いについては後述に譲るんですが、違いとしてはどの状態のシェル(ログインシェルなのか、そうじゃないのかなど)に応じて、読み込まれるファイルが違ったり、順番が違うとのこと。でどうしろというと

基本的に設定は.zshrcファイルに書いておけばいい

環境変数を設定するなどログイン時に一度だけ実行すればいいような設定だけ.zprofileに書いておく
みたいですね。(今zprofile使ってないけど)

うん。。。?.zsh_local いなくね?
結局zsh_localって何かというと、自分用の設定変数であったり、外部に見せたくない設定ファイルの中身なんかを書いておき、それを.zshrcで読み込むようにするものなんですね。
http://mironal-memo.blogspot.jp/2013/02/gist.html
(うちもこれと全く一緒の方法でやってる)
例えばawsのaccesskeyなんかって絶対外部に漏れちゃいけない、けどコードはgithubで公開したいって時に、.zshrcに

if [ -f ~/.zsh_local ]; then
  source ~/.zsh_local
fi

って書いて、zsh_localに

export AWS_ACCESS_KEY=hogehoge
export AWS_REGION=hugahuga

みたいな感じで書いちゃえばよいみたい。
あーすっきりしました。。。しました?あれ、これやと最初の回答になってないですね。

dockerでよみこんでもらうためには

そもそもdockerって種類はどうあれ、自分のPC上にdocker serverを立ち上げて、そのコンテナ(PC)上で作業してるんで要は別PCっすよね。じゃあ自分のマシンで設定してる環境変数使えんやん、、、!

そこででてきたdotenv先生

ちょっといきなり飛んじゃいますが、今のプロジェクトでrailsを使ってます。docker上にええ感じに
設定ファイル読み込ませるのってどうしたらええんやろ。。そんなときにdotenv先生(gem)です。
なにができるかというと、プロジェクトディレクトリに.envファイルを作って、そこに設定内容(AWSのkeyとか)を書きます。
そうするとあら不思議、そのプロジェクト上でその設定ファイルが読み込まれます。
そして.envファイルを.gitignoreしておくと、pushしても公開されない、、あら便利。
これきっと嬉しいのっていろんなプロジェクトやってるときとか設定内容全部.envに書いておくと、それぞれのプロジェクトごとに必要な設定内容をきにしなくてつかえるから 便利なんでしょうね。

なんでdockerにかぎらず、VM使うときでも、ホスト(ローカルマシン)での設定ファイルはよみこまれません。困ったなと思ったらdotenv先生を使ったらええんです。(gitignoreをしましょう)
dotenvの使い方は下記より
http://qiita.com/closer/items/f8d8ba00ae86d7051764

今日の総評

ローカルマシンでは.zshrc、各プロジェクトごとの設定内容は.envに書きましょう

<追記>
環境変数書いたあと、ちゃんと
source .env
って感じで更新しましょう。
あとlessでちゃんと更新が反映されてるかの確認も