この投稿はOpen PaaS Advent Calendar 2015の10日目の記事です。
OpenShiftでおもむろにnginxをデプロイしてみます。
$ oc new-app nginx # official "nginx" docker image on docker hub
oc get all
してみますが、CrashLoopBackOffという状態になっていて稼働していないようです。RESTARTSが3になっていて増加していってるようです。
$ oc get all NAME DOCKER REPO TAGS UPDATED nginx library/nginx 1.7.10,latest,1 + 19 more... About a minute ago NAME TRIGGERS LATEST nginx ConfigChange, ImageChange 1 CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE nginx-1 nginx library/nginx@sha256:0a8bad8dfc80e38ccdd09c41d4efd2547fa9d6d58d8706431952a2ef312e2034 app=nginx,deployment=nginx-1,deploymentconfig=nginx 1 1m NAME CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE nginx 172.30.126.189 <none> 80/TCP,443/TCP app=nginx,deploymentconfig=nginx 2m NAME READY STATUS RESTARTS AGE nginx-1-0khqs 0/1 CrashLoopBackOff 3 1m
back offというのは意図的に待っている状態で、この場合は再起動のインターバルを待っている状態です。docker pull待ちのDockerPullBackOffというのもあります。
oc logs
でログを見てみましょう。
$ oc logs nginx-1-0khqs Error from server: Internal error occurred: Pod "nginx-1-0khqs" in namespace "test": container "nginx" is in waiting state.
コンテナが現在稼働していないのでログが取れないと言われてしまいました。困りましたね。
このような場合、--previous
というオプションを指定することで、前回のログを見ることができます。
$ oc logs --previous nginx-1-0khqs nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied) 2015/12/15 05:08:11 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2 2015/12/15 05:08:11 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (13: Permission denied)
Permission deniedですね。OpenShiftでPermission deniedが出ている場合は大抵USERが指定されているか、もしくはUSERを指定しておらずrootでの動作を前提としてしまっているイメージです。
OpenShiftではuser IDで権限を制御する部分があるので、USERによるユーザ名指定はデフォルトで禁止されており、動的にユーザIDが割り当たるようになっているため、上記のようなイメージはこのようなパーミッションエラーを引き起こします。詳しい説明はイメージガイドラインのSupport Arbitrary User IDsのところに記述されています。
ちなみにUSER、USER未指定rootの利用を許可する設定もできます。
oc logs --previous
はKubernetes由来のもので、kubectl logs --previous
というコマンドなのですが、どちらもぐぐってもほとんど情報が出てこないという謎の隠しコマンド状態です。なんででしょうね。レアポケモンの紹介でした。
追記: 初出時に「USERの指定がされているためエラーになった」旨で記載していましたが、実際にはnginxのイメージは「USERの指定がされていない、かつ実行時root前提のためエラーになった」というものだったので修正しました。