今の環境がDocker Containerとして動作しているかどうかをコマンドで調べる

morimorihogeです。最近やたらインフラの仕事をしてることが多いです。インフラ仕事は嫌いじゃないのですが、集中して作業する時間を確保しないとミスが怖いので作業時間の確保が大変ですね。ゲームする時間も取らないといけないのに。忙しい忙しい。

またしても小ネタです。

オンプレ?VM?Container?

最近はDockerをはじめとするContainerで、HVMとかPVな感じで普通にLinuxが起動してくる環境ではない環境を触ることも増えました。
Dockerを代表とするContainer環境はここ3〜5年くらいで一部の意識高い層が使うものからかなりコモディティシフトしてきたように思えます。事例も増えたしproductionで使ってるケースも増えました。

とはいえ、Containerは設計思想がVMベースとは異なるので、これまでVPC等の仮想マシン環境やオンプレを使ってきた人達にとっては色々とルールが異なるので戸惑うこともあります。
また、最近はprovisioningをChefAnsibleItamae等で自動化するといった流れもあるのですが、開発者はDocker環境で構築するけど本番環境はVMといったケースもあり、環境毎に動かないコマンドがあったりする場合には個別に制御する必要が出てきます。インフラエンジニアは意識高い所をやろうとするとかなり辛みもあるのでその辺のさじ加減が求められてる感じありますね。

弊社では開発環境はほとんどDocker環境になりましたが、本番環境ではまだ限定的な利用としていることが多いです。受託開発なんかだと、自分達しか保守できないものをリリースして納品するというのはやや抵抗があるので、なるべく引き継ぎできるエンジニアの多い普通のVM環境を想定した方が後々辛みを生まないだろう、という落としどころでやっています。
ただ、自由度が大きなプロジェクトなんかではアリですね。最近は新しい技術を使ってOKというお客様も増えましたので、品質が上がる方向に良い技術は取り入れていっています :)

Docker Containerかどうかは /.dockerenv があるかどうかで分かる

長々と前口上を書きましたが、Docker Containerかどうかは /.dockerenv ファイルの有無で分かります(以下は公式ubuntuコンテナ)。

このファイルはDocker Containerのセットアッププロセスっぽいところで定義されている ので恐らくどんなContainerでも使って良いと思います。
他にも /.dockerinit というファイルがあったようですが、こちらはv1.11から削除されているようなので今は使わない方が良いでしょう

シェルスクリプトの中から調べるなら普通にtestコマンドを使えば良いので、Itamae recipeであれば

# systemd依存な処理
not_if 'test -f /.dockerenv'
# Dockerの場合の代替処理
only_if 'test -f /.dockerenv'

みたいな感じで書けば良いかと思います。

まとめ

そんなわけでインフラ作業のメモがてら記事にしてみました。なおこれはDockerを使っている場合の話なので、systemd-nspawnなど別のコンテナ環境を使っている場合には使えないです。あしからず。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

morimorihoge

高校卒業後,学生をやりながらずっとWebアプリ開発に携わってきました.2010くらいまではPHP/Symfonyプログラマでしたが,それ以降のWeb開発はRailsほぼ一本に宗旨替えしました.開発とは別にサーバ構築・運用も10年以上やってきているので,要件定義から設計・実装・環境構築・運用まで一通り何でもこなせます.開発以外では季節により大学でWebサービス開発やプログラミング関連の非常勤講師もしており,技術の啓蒙・教育にも積極的に関わっています.最近はPM的な仕事が増えていますが,現役開発者としていつでも動ける程度にはコードもサーバも弄る日々を送っています.AWS 認定ソリューションアーキテクト – アソシエイトレベル取りました

morimorihogeの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ