CoreOSで頻繁に手動でコンテナを起動していると、各種環境変数をいい感じで管理するためにdirenvを使いたくなります。
direnvのバイナリをダウンロードして導入することもできますが、今回はCoreOS上でdirenvをソースからコンパイルして導入する方法を紹介します。
direnv自体の使い方については
等に分かりやすく解説されていますので、こちらを参照ください。
ちなみに、CoreOSは利用できるライブラリが限られ、独自にライブラリをインストールすることも難しいため、独自にツールを導入する場合にはバイナリ単体で動作するツールを入れることが多いです。direnvもgo実装のバイナリ単体で動作するツールです。
手順概要
全体の手順としては以下のとおりです。
- GitHubからリポジトリをクローン
- ソースをdockerコンテナ内部でコンパイル
- バイナリを
/opt/bin
にコピー .bashrc
にdirenv用のhookを設定
direnv リポジトリのクローン
まず、direnvのリポジトリをGitHubからクローンします。
1 2 3 |
$ git clone https://github.com/direnv/direnv $ cd direnv |
dockerコンテナ内部でソースをコンパイル
コンパイルですが、CoreOSにはそもそもgolangが入っていないし、入れるのも大変なので、direnvのソースディレクトリをgolangのコンパイル環境を備えたdockerコンテナにマウントしてコンパイルします。
コンパイルには、Dockerオフィシャルのgolang環境のコンテナである golang
を利用します。
お好みですが、コンパイル前に、まず最新リリースのコミットにチェックアウトします。
(記事執筆時点では、 v2.7.0 でした)
1 2 |
$ git checkout v2.7.0 |
そして、golangコンテナにカレントディレクトリをマウント(コンテナ内部の /usr/src/myapp
に)してコンパイルします。
direnvはコンパイル用にMakefileが用意されているため、makeコマンドでコンパイルできます。
下記のようにコンテナを起動してコンパイルします。
1 2 |
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang make |
初回はコンテナのダウンロードで多少時間がかかるかと思いますが、コンテナが起動しコンパイルが終わると、カレントディレクトリにdirenvのバイナリができています。
バイナリを/opt/bin
にコピー
CoreOSは、/opt/bin
にデフォルトでパスが通っているので、独自にツールを入れる場合はここが便利です。
下記のようにdirenvのバイナリを /opt/bin にコピーします
1 2 3 4 5 6 |
# /opt/bin が無い場合は作成します $ sudo mkdir -p /opt/bin # direnvを/opt/binにコピー $ sudo cp direnv /opt/bin |
.bashrc
にdirenv用のhookを設定
direnvはディレクトリ移動毎に、.envrc
ファイルの有無を判定し環境変数をロード・アンロードするツールのため、利用しているシェルに応じたhookを.bashrc
等に設定する必要があります。CoreOSの場合はbashなので、ホームディレクトリの.bashrc
にdirenv用のhookを追加します。
まずその前に、CoreOSの.bashrc
はデフォルトではシンボリックリンクなので、リンクを解除します。
1 2 |
$ cp $(readlink .bashrc) .bashrc.new && mv .bashrc.new .bashrc |
そして、.bashrc
にdirenv用のhookを追記します。
1 2 |
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc |
以上で設定完了です。シェルの再起動後からdirenvを利用できます。