DockerでRubyを使う場合の注意点

Last-modified: Tue, 20 Feb 2018 23:00:19 JST (295d)

DockerHubにあるRubyコンテナを使う場合、注意する点が2つあります。

  • タイムゾーンがUTC
  • 文字コードがUS-ASCII

まず、タイムゾーンがUTCなので、JSTにしたい場合、Docker起動時に環境変数で渡します。

C:\Users\akira>docker run -it -e "TZ=Asia/Tokyo" ruby:2.4 /bin/bash
root@67da4786fc69:/# date
Tue Feb 20 22:40:39 JST 2018

忘れると、Time.nowで9時間ずれます
activesupportを使うと、

[1] pry(main)> require 'active_support'
=> true
[2] pry(main)> require 'active_support/core_ext'
=> true
[3] pry(main)> Time.now
=> 2018-02-20 13:49:48 +0000
[4] pry(main)> Time.now.in_time_zone('Japan')
=> Tue, 20 Feb 2018 22:49:57 JST +09:00

のように変換することもできます。内部処理はすべてUTCにして、必要に応じJSTに変換。という場合はこのようなやり方でも良さそうです。
次に、地味に悩んだのが、文字コードがUTF-8にならない。
Rubyスクリプトには

# -*- coding: utf-8 -*-

とマジックコメントを記載しているのですが、

ArgumentError: invalid byte sequence in US-ASCII

と冷たくあしらわれるgemが時々あります。
外部エンコーディングが設定できなかった場合、US-ASCIIがデフォルトになるようです。
ググると、環境変数LANGを設定するとか、RUBYOPTにセットとか出てきますが、
自分の場合どれも効果はありませんでした。

hoge.encode!("ASCII")

と文字コードを変更しても効果はなく、
結局ソースコード中に

Encoding.default_external = "UTF-8"

と記載したら直りました。


Counter: 152, today: 1, yesterday: 1

このページの参照回数は、152です。