docker 中 Jenkins 运行 触发的 npm 测试输出中的编码损坏

Broken encoding in npm test output triggered by Jenkins running in docker

几个月来我一直头痛不已。我们正在使用持续集成管道,其中一个步骤是由 npm test 触发的自动化测试,它将在 docker 容器中的 jenkin 的奴隶 运行 内进行,Jenkins 本身在另一个容器中容器。 在构建期间,输出显示如下所示:

node-schedule@0.2.9 node_modules/node-schedule
��������� long-timeout@0.0.2

通过谷歌搜索我发现这是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

找到