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

标签 linux node.js jenkins docker locale

几个月来我一直头痛不已。我们正在使用持续集成管道,其中一个步骤是由 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/

相关文章:

linux - 如何转义 bash 脚本命令行中传递的参数

c++ - Valgrind 的地 block 工具不会分析我的应用程序

node.js - 从 hapi-js 路由自动生成 swagger.yaml

jboss - Jenkins 可以在构建操作之间添加 sleep 时间吗?

jenkins - 如何在build.gradle文件中定义变量,其值由jenkins动态传递

java - 如何远程终止亚马逊EC2 Linux实例上的进程

linux - 如何更改配置脚本的临时目录?

javascript - (Javascript Node.js) 如何从 IIFE 获取变量

node.js - 如何从 Node 模块导出 Typescript 接口(interface)?

jenkins - 在 gradle 中解决来自 Artifactory 的传递依赖