Docker 이미지를 작성 중인데 Ubuntu 14.04
로케일을 올바르게 설정하는 데 문제가 있습니다.
(14.04가 EOL이라는 것을 알고 있지만 여전히 작동해야 합니다. 그렇죠? askubuntu.com에서 Ubuntu 사람들의 지원이 거부되었으므로 여기서 행운을 시험해 보겠습니다.)
내 Dockerfile
모습:
COPY .bashrc /root/.bashrc
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y build-essential \
locales
RUN dpkg-reconfigure locales
WORKDIR /home/prs/
어디 .bashrc
:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
오류 없이 빌드되지만 docker build -t "test" .
실행하면 다음과 같은 출력이 표시됩니다.
$ docker run -it test
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
root@d09247a538eb:/# source /root/.bashrc
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
root@d09247a538eb:/#
나는 또한 다음을 시도했습니다.
echo "LANG=en_US.UTF-8" > /etc/locale.conf
나는 여전히 다음을 얻습니다.
# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
어떻게 되어가나요? 로케일을 올바르게 설정하는 방법은 무엇입니까?
고쳐 쓰다:
내 컨테이너 이미지가 다음을 기반으로 하는 경우 타이핑하는 동안 선택할 Ubuntu 18.04
수 있지만 (현재 필요한 것) 을 사용하면 다음과 같은 결과를 얻을 수 있습니다.locale
# dpkg-reconfigure locales
14.04
# dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "en_US.UTF-8",
LC_ALL = "en_US.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
또한 Eduardo Trápani(@EduardoTrápani)가 아래에 제안한 대로 로케일을 수동으로 실행해 보았습니다.
# echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
en_US.UTF-8 UTF-8
# locale-gen
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
locale-gen
또 다른 힌트는 locales/sup[ported.d 디렉토리에 아무것도 없다는 것입니다(http://manpages.ubuntu.com/manpages/precise/man8/locale에서 이것을 올바르게 이해했다면 이것이 결과여야 합니다). .8.html):
# ls -l /var/lib/locales/supported.d/
합계 0
답변1
보고 있는 문제는 기본적으로 C
(라고도 함 POSIX
) 및 (UTF-8 버전) C.UTF-8
이외의 Docker 컨테이너에 내장된 로캘이 없다는 것입니다 . 이는 glibc에는 많은 공간을 차지하는 많은 수의 로케일이 포함되어 있고 Debian과 Ubuntu는 공간을 절약하기 위해 패키지에 압축된 버전만 제공하므로 locales
시스템에 특정 로케일을 구축해야 하기 때문입니다.
UTF-8을 사용하는 영어 로케일만 찾고 있다면 그것이 C.UTF-8
귀하의 요구에 적합할 수 있으며 컨테이너에 새 로케일을 구축할 필요가 없습니다. 간단히 사용할 수 있습니다 LC_ALL=C.UTF-8 docker run -it test
.
그러나 특별히 미국 영어 로케일이 필요한 경우(예를 들어 어떤 이상한 이유로 Avoirdupois 시스템을 정말 좋아하고 이를 함께 사용하려는 경우 LC_MEASUREMENT
) 가장 쉬운 해결 방법은 locales-all
패키지를 설치하는 것입니다. 이는 모든 로케일에 대해 사전 빌드된 버전을 제공합니다.
또는 공간이 절실한 경우 Dockerfile을 업데이트하여 다음 줄을 추가할 수 있습니다.
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
그러면 원하는 로케일이 구축됩니다.
궁극적인 해결책은 .bashrc
로케일이 유효한지 감지하고 그렇지 않은 경우 다른 값으로 설정하는 것입니다. 저는 영어가 모국어이지만 프랑스어 로케일을 자주 사용하는데, 이는 제가 사용하는 모든 시스템에서 항상 사용할 수 있는 것은 아니기 때문에 이 접근 방식을 채택했습니다. 다음 명령을 실행할 수 있습니다. $locale
해당 로캘이 존재하면 0으로 종료되고, 그렇지 않으면 0이 아닌 값으로 종료됩니다.
$ perl -MPOSIX=locale_h -E 'exit !setlocale(LC_ALL, $ARGV[0]);' "$locale" \
2>/dev/null
답변2
에 로캘을 추가하고 /etc/locale.gen
빌드한 다음 사용할 수 있습니다.
$ sudo echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
$ sudo locale-gen
이러한 명령을 docker 파일에 넣을 수 있습니다.