I'm running a Ubuntu Docker container. I have a Norwegian keyboard and need to use Norwegian characters (øæå).
My Terminal character encoding is set to UTF-8 and I'm connected to my container using SSH. However, I'm unable to type Norwegian characters, nor copy and paste Norwegian characters, nor use CTL+SHIFT+U+00f8.
I tried:
locale-gen nb_NO.UTF-8
but nothing changed. How do I set the locale and keyboard inside a Docker container?
Those who use Debian also have to install locales
package.
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=en_US.UTF-8
ENV LANG en_US.UTF-8
This answer helped me a lot.
I dislike having Docker environment variables when I do not expect user of a Docker image to change them.
Just put it somewhere in one RUN
. If you do not have UTF-8 locales generated, then you can do the following set of commands:
export DEBIAN_FRONTEND=noninteractive
apt-get update -q -q
apt-get install --yes locales
locale-gen --no-purge en_US.UTF-8
update-locale LANG=en_US.UTF-8
echo locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8 | debconf-set-selections
echo locales locales/default_environment_locale select en_US.UTF-8 | debconf-set-selections
dpkg-reconfigure locales
Just add
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
into your Dockerfile. (You may need to make sure the locales
package is installed.) Nothing else is needed for the basic operation.
Meanwhile, outside of Ubuntu, locale-gen
doesn’t accept any arguments, that’s why none of the ‘fixes’ using it work e.g. on Debian. Ubuntu have patched locale-gen
to accept a list of locales to generate but the patch at the moment has not been accepted in Debian of anywhere else.
@Mixel's answer worked great for the Ubuntu-based docker image we have.
However, we also have a centos-based docker image for testing recipes via chef (using the kitchen-docker
driver). One of the packages we pre-install was failing to install due to no locale being set. In order to get a locale installed, I had to run the following:
localedef -c -f UTF-8 -i en_US en_US.UTF-8
export LC_ALL=en_US.UTF-8
I got this information from this answer on ServerFault.
After running the above commands as part of the docker provisioning the package installed without any errors. From .kitchen.yml
:
platforms:
- name: centos7
driver_config:
image: #(private image)
platform: centos
provision_command:
- localedef -c -f UTF-8 -i en_US en_US.UTF-8
- export LC_ALL=en_US.UTF-8
You guys don't need those complex things to set locales on Ubuntu/Debian. You don't even need /etc/local.gen
file.
Simply locale-gen
will do everything and the author only missed locales
package.
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& locale-gen "en_US.UTF-8"
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
I found this the simplest and the most effective. I confirm it works on Ubuntu 16.04.
For me what worked in ubuntu image:
FROM ubuntu:xenial
USER root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install --no-install-recommends -y locales && rm -rf /var/lib/apt/lists/*
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf
Rather than resetting the locale after the installation of the locales package you can answer the questions you would normally get asked (which is disabled by noninteractive
) before installing the package so that the package scripts setup the locale correctly, this example sets the locale to english (British, UTF-8):
RUN echo locales locales/default_environment_locale select en_GB.UTF-8 | debconf-set-selections
RUN echo locales locales/locales_to_be_generated select "en_GB.UTF-8 UTF-8" | debconf-set-selections
RUN \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y locales && \
rm -rf /var/lib/apt/lists/*
I actually happened to have suffered from the same problem, but none of the provided answers are 100% working with debian:latest, even if they provide good hints.
The biggest difference is that you should make sure both locales and locales-all are installed, the latter already containing en_US.UTF-8, so you don't have to generate it with local-gen or dpkg-reconfigure.
Here's what I've done in my Dockerfile to make it work:
FROM debian:latest
RUN apt-get update
RUN apt-get install -y locales locales-all
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
I used this (after RUN apt-get install -y python3
):
RUN apt-get install -y locales
RUN apt-get install -y language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN python3 -c "print('UTF8 works nice! ')"
And it prints UTF8 works nice!
correctly.
Specify the LANG
and LC_ALL
environment variables using -e
when running your command:
docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -it --rm <yourimage> <yourcommand>
It's not necessary to modify the Dockerfile.
Tip: Browse the container documentation forums, like the Docker Forum.
Here's a solution for debian & ubuntu, add the following to your Dockerfile:
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG en_US.UTF-8
Source: Stackoverflow.com