🐕

Dockerでコンテナが動作しないときの確認作業など

2023/11/17に公開

経緯

Dockerコンテナにrailsサーバを立てて、unicornで公開したい旨の動作不良の相談を受けて対応した。

伝えたいこと

ログを見ろ、ログがわからない場合、ログの見方、見つけ方を検索・相談しよう。
今自分がどういう状況なのかわかれば、心理的負担も少なくなる。

手元でbuildし起動

最初に発生したエラーがこれ、このログはdocker desktopなどに表示されるエラー

bundler: failed to load command: unicorn (/usr/local/bundle/bin/unicorn)
/usr/local/bundle/gems/unicorn-6.1.0/lib/unicorn/configurator.rb:104:in `block in reload': directory for pid=/app/tmp/pids/unicorn.pid not writable (ArgumentError)
            raise ArgumentError, "directory for #{var}=#{path} not writable"
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/app/tmp/pids/unicorn.pid
この部分に権限がないから発生しているエラーだったので、Dockerfileに権限追加部分を記述

# Unicorn の PID ディレクトリの作成と権限設定
RUN mkdir -p /app/tmp/pids && \
    chmod -R 755 /app/tmp/pids

再起動したが速攻で落ちる、かつ、ログが残らない

方針をコンテナ内に入ることに設定

CMDコマンドでunicornを実行していたので、そこをコメントアウトし、方針をコンテナ内に入ることを目標にした。
コメントアウトし、再ビルド。

docker run -p 3000:3000 -it rails-my-image bash

こんな感じでポートは開きつつ、ターミナル操作ができるように実行

ログはいずこ?

ls -aでlogがあるっぽい場所を見つける。
railsだったので/app/logがあった。

root@629bcfaa342d:/app# ls
Gemfile       README.md  app  config     db   log  public   tmp
Gemfile.lock  Rakefile   bin  config.ru  lib  prd  storage  vendor
root@629bcfaa342d:/app# 
root@629bcfaa342d:/app# ls -al log 
total 24
drwxr-xr-x 1 root root 4096 Nov 17 08:28 .
drwxr-xr-x 1 root root 4096 Nov 17 07:21 ..
-rw-r--r-- 1 root root    0 Nov 17 03:57 .keep
-rw-r--r-- 1 root root    0 Nov 17 08:35 production.log
-rw-r--r-- 1 root root  383 Nov 17 08:28 unicorn.stderr.log
-rw-r--r-- 1 root root    0 Nov 17 07:21 unicorn.stdout.log
root@629bcfaa342d:/app# 

下記、ファイルサイズが増えていることがわかる。
-rw-r--r-- 1 root root 383 Nov 17 08:28 unicorn.stderr.log

ログを見る

root@db8c46d2bcc0:/app/log# cat unicorn.stderr.log
I, [2023-11-17T07:17:09.292116 #44]  INFO -- : Refreshing Gem list
I, [2023-11-17T07:17:09.518426 #44]  INFO -- : listening on addr=0.0.0.0:3000 fd=8
E, [2023-11-17T07:17:09.538492 #44] ERROR -- : Cannot load database configuration:
Could not load database configuration. No such file - ["config/database.yml"] (RuntimeError)

ファイルがなくてエラーになってる。
Could not load database configuration. No such file - ["config/database.yml"]

これのデータを作成して、データベースの設定したら起動できた。

root@629bcfaa342d:/app# bundle exec unicorn -p 3000 -c /app/config/unicorn.rb -E production

起動っていうのはCMDで指定したコマンドね。
アクセスが成功したログなんかもlogディレクトリ配下にあるから、確認すると良い。

結論

ログを見ればなんとなくわかるようになる。
慣れてくれば勘所もつかめるようになる。
あと、ChatGPTとかはガンガン使え。
マジで勉強になる。
エラーとかそのまま貼ったらええんや。

Discussion