几个月来我一直头痛不已。我们正在使用持续集成管道,其中一个步骤是由 npm test 触发的自动化测试,它将在运行在 docker 容器中的 jenkin 的 slave 中进行,Jenkins 本身在另一个容器中。 在构建过程中,输出显示如下所示:
node-schedule@0.2.9 node_modules/node-schedule
��������� long-timeout@0.0.2
通过谷歌搜索,我发现这是 an issue caused by not setting the locale在unix系统中。我尝试在 Dockerfile 中添加环境变量,但仍然没有成功。还尝试运行 locale-gen,我得到命令未找到错误:
RUN locale-gen ${LANGUAGE}
当我尝试安装它时,我没有找到候选包。
RUN apt-get install locales
这是从属的 Dockerfile。
# NODEJS SLAVE
# Pull base image.
FROM node:0.10.42
ENV LANG_WHICH en
ENV LANG_WHERE US
ENV ENCODING UTF-8
ENV LANGUAGE ${LANG_WHICH}_${LANG_WHERE}.${ENCODING}
ENV LANG ${LANGUAGE}
RUN dpkg-reconfigure --frontend noninteractive locales \
&& apt-get update -qqy \
&& apt-get -qqy install \
language-pack-en \
RUN apt-get install -y nano openssh-server openjdk-7-jdk \
&& apt-get -y upgrade
EXPOSE 8080
<... ssh stuff...>
COPY package.json /src/package.json
RUN npm install -g npm
# Standard SSH port
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
这是 Jenkins master 的容器 Dockerfile
# JENKINS MASTER
# Set the base image to Ubuntu
FROM jenkins:latest
ENV LANG_WHICH en
ENV LANG_WHERE US
ENV ENCODING UTF-8
ENV LANGUAGE ${LANG_WHICH}_${LANG_WHERE}.${ENCODING}
ENV LANG ${LANGUAGE}
RUN localedef en_US.UTF-8 -i en_US -fUTF-8
RUN dpkg-reconfigure --frontend noninteractive locales \
&& apt-get update -qqy \
&& apt-get -qqy install \
language-pack-en \
USER jenkins
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
COPY plugins.txt /usr/share/jenkins/plugins.txt
COPY executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
谁能提供一些解决此问题的指导?
更新:
通过将基本镜像更改为 ubuntu:xenial,我能够使用 locale-gen。但这也没有用。 Jenkins 似乎通过 non-interactive shell 连接到奴隶这会导致它不加载所需的配置(/etc/profile
和 /etc/default/locale
)。
我也尝试添加:
USER jenkins
RUN echo "export=LC_ALL=en_US.UTF-8" >> /etc/.bashrc
但这也没有用。 HERE是我现在正在使用的完整 Dockerfile。
最佳答案
当我遇到类似的问题时,我最终使用了我能找到的所有解决方案。
使用下面的方法对我有用,可能并不是所有的方法都需要,但是一旦我开始使用它,我就不想再去尝试了。
RUN echo "en_US UTF-8" >> /etc/locale.gen
RUN dpkg-reconfigure locales
RUN locale-gen en_US.UTF-8
RUN localedef -c -i en_US -f UTF-8 en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
完整的 Dockerfile 可以在 https://github.com/evolution7/nodejs-bower-grunt 找到
关于linux - 由在 docker 中运行的 Jenkins 触发的 npm 测试输出中的编码损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507581/