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
找到
几个月来我一直头痛不已。我们正在使用持续集成管道,其中一个步骤是由 npm test 触发的自动化测试,它将在 docker 容器中的 jenkin 的奴隶 运行 内进行,Jenkins 本身在另一个容器中容器。 在构建期间,输出显示如下所示:
node-schedule@0.2.9 node_modules/node-schedule
��������� long-timeout@0.0.2
通过谷歌搜索我发现这是unix系统中的
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
找到