在Linux上运行时gsub编码错误Docker容器US-ASCII中的无效字节序列

我有一个string,我从"\r\n""\n"行结束使用:

 input.gsub(/\r\n?/, "\n") 

当我在Windows主机上运行它时,它工作正常。 当我运行在我的Linux主机上,在一个泊坞窗容器中,我得到这个错误:

 in `gsub': invalid byte sequence in US-ASCII (ArgumentError) 

我正在运行Ruby 2.2。

我通过这样做解决了UTF-8(ArgumentError)中的无效字节序列

回答这个问题是为了logging目的。 看起来像这样的编码问题并没有孤立到用户的单个string,而是在docker中的已知问题,如下所述:

https://oncletom.io/2015/docker-encoding/

似乎有些图像取决于原始的Debian图像,并且:

Debian在2011年删除了对locales包的依赖 。它解释了en_US.UTF-8的不可用性。

这将解释为什么inheritance系统configuration的一些docker映像无法使用UTF-8。

 $ docker run -ti --rm ruby:2.1.5 ruby -e 'puts STDIN.external_encoding' > US-ASCII 

docker中的locale命令显示空值,它们应该是系统中的值:

 $ docker run -ti --rm ruby:2.1.5 locale LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= 

在初始化中定义LOCALEvariables应该可以工作:

 $ docker run -ti --rm -e LANG=C.UTF-8 ruby:2.1.5 ruby -e 'puts STDIN.external_encoding' > UTF-8 

更好的是,你可以把它定义到Dockerfile中

 #/Dockerfile FROM ruby:2.1.5 ENV LANG C.UTF-8