Estoy tratando de ejecutar mi archivo python que primero lee una cadena en idioma chino e imprimirlo.
Este es mi Dockerfile
FROM python:2.7-onbuild ENV LANG en_US.UTF-8 ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]Este es mi archivo python:
# -*- coding: utf-8 -*- import jieba s = "我来到北京清华大学" s = s.decode('utf-8') print type(s), sEntonces ejecuto:
docker build -t python-example .
docker run python-example
Error que recibí: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
Cuando lo ejecuto localmente, funciona bien.
Pon esto en tu Dockerfile :
ENV PYTHONIOENCODING=utf-8o como se menciona en los comentarios anteriores, páselo en la línea de comando:
docker run -e PYTHONIOENCODING=utf-8 my-python-image some-command Cuando inicia el intérprete de Python, Python tiene que configurar stdout para enviar la salida a su terminal. En su sistema operativo moderno, su terminal probablemente informe que admite UTF-8 o alguna otra codificación avanzada. Puede ver qué codificación se usa ejecutando este comando:
$ python -c 'import sys; print(sys.stdout.encoding)' UTF-8Cuando ejecuta un contenedor docker, las variables de entorno que Python esperaría usar una codificación más avanzada no están presentes, por lo que Python recurrirá a un conjunto de caracteres básico para garantizar la compatibilidad. Puede verificar esto ejecutando el mismo comando en su contenedor:
$ docker run my-python-image python -c 'import sys; print(sys.stdout.encoding)' ANSI_X3.4-1968 Cuando pasamos PYTHONIOENCODING , vemos que sys.stdout.encoding está configurado correctamente:
$ docker run -e PYTHONIOENCODING=UTF-8 my-python-image python -c 'import sys; print(sys.stdout.encoding)' UTF-8 Lea acerca de PYTHONIOENCODING en la documentación de Python . Esta respuesta también entra en gran detalle sobre la codificación/descodificación y la stdout .
Me encontré con el mismo problema mientras implementaba una aplicación Django con supervisor y gunicorn.
Lo que solucionó fue agregar la siguiente línea a mi archivo de configuración de supervisor:
environment=LANG="es_ES.utf8", LC_ALL="es_ES.UTF-8", LC_LANG="es_ES.UTF-8"Para su caso, asegúrese de que la configuración regional china que desea imprimir esté disponible e instalada en su contenedor docker. Este blog describe cómo hacerlo: ejemplo dockerfile (use la configuración regional china en lugar de en_CA.UTF-8):
FROM ubuntu:15.10 MAINTAINER Mobify <ops@mobify.com> RUN apt-get -qq update && \ apt-get -q -y upgrade && \ apt-get install -y sudo curl wget locales && \ rm -rf /var/lib/apt/lists/* # Ensure that we always use UTF-8 and with Canadian English locale RUN locale-gen en_CA.UTF-8 COPY ./default_locale /etc/default/locale RUN chmod 0755 /etc/default/locale ENV LC_ALL=en_CA.UTF-8 ENV LANG=en_CA.UTF-8 ENV LANGUAGE=en_CA.UTF-8Esperemos que esto te lleve en la dirección correcta.
Agrego el siguiente comando en mi archivo acoplable:
RUN locale-gen en_US.UTF-8 ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'luego construya/reconstruya las imágenes de la ventana acoplable, será mejor que agregue esto en la imagen base.