ロケール設定をちゃんとやってなかったdockerコンテナ上で、2バイト文字でつまったとき用のメモです。普通の環境であればインストール時にロケール設定されているはずですが、dockerでちょっと試したい時の暫定対処用。
症状
既存ファイルがないときやdiffが表示されない場合などはエラーにならないけど、ファイルを置き換えるなどで2バイト文字を含むdiffが表示される場合(--testオプションあり)で次のようなエラーになる。
Error: invalid byte sequence in US-ASCII
Error: /Stage[main]/Main/File[/tmp/puppet_erb_sample.txt]/content: change from {md5}5bf1f316d6eebb76edac121be636451c to {md5}f1995f537d52ea45d62b5858778f4368 failed: invalid byte sequence in US-ASCII
原因
RubyがUS-ASCIIになっている。
# /opt/puppetlabs/puppet/bin/ruby -e 'puts Encoding.default_external'
US-ASCII
暫定対策
試すだけであれば、一時的にRUBYOPTをUTF-8に設定。
実行するコマンドの前に、RUBYOPT=-EUTF-8をつける。
# RUBYOPT=-EUTF-8 /opt/puppetlabs/puppet/bin/ruby -e 'puts Encoding.default_external'
UTF-8
puppet applyするときも。
# RUBYOPT=-EUTF-8 /opt/puppetlabs/bin/puppet apply erb01.pp --modulepath=modules -t --noop
きちんとするなら、docker run時に言語設定。
docker run -it -e RUBYOPT=-EUTF-8 centos /bin/bash
さらにきちんとする場合は、Dockerfileでビルドするときにロケール設定をする。
バージョンとか
# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
# rpm -qa | grep puppet
puppetlabs-release-pc1-1.0.0-1.el7.noarch
puppet-agent-1.4.1-1.el7.x86_64