Рейтинг:1

Docker PostgreSQL меняет кодировку базы данных на UTF-8

флаг in

Я хочу запустить через docker-compose контейнер postgres, который имеет COLLATE и CTYPE 'C' и кодировку базы данных 'UTF-8'. Но это выглядит невозможным.

Это часть docker-compose.yml:

база данных:
    изображение: postgres: последний
    тома:
        - БД:/var/lib/postgresql/данные
    среда:
        POSTGRES_PASSWORD: тест
        LC_COLLATE: С
        LC_CTYPE: С
        ЯЗЫК: C.UTF-8

И это вывод журнала:

Кластер базы данных будет инициализирован с локалями.
Конфигурация текстового поиска по умолчанию будет установлена ​​на «english».
  РАЗБОР: С
  ТИП: С
  СООБЩЕНИЯ: C.UTF-8
  ДЕНЕЖНЫЙ: C.UTF-8
  ЦИФРОВОЙ: C.UTF-8
  ВРЕМЯ: C.UTF-8
Соответственно, кодировка базы данных по умолчанию была установлена ​​на "SQL_ASCII".

Я должен иметь кодировку базы данных в UTF-8 и COLLATE и CTYPE в «C» и нет «C.UTF-8», иначе зависимое приложение не сможет подключиться.

Я ничего не нашел ни в документации, ни где-либо еще.

Рейтинг:2
флаг cn

Здесь вам нужно соединить две части головоломки:

https://www.postgresql.org/docs/9.5/app-initdb.html

initdb учит, как передавать информацию о кодировании в функцию создания базы данных.

В официальном образе Docker postgres указано, что вы можете передавать параметры в initdb:

https://hub.docker.com/_/postgres

Следовательно, ответ будет примерно таким:

база данных:
    изображение: postgres: последний
    тома:
        - БД:/var/lib/postgresql/данные
    среда:
        POSTGRES_PASSWORD: тест
        POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'

Или подобные аргументы. Я проигнорировал параметр lang, так как это не официальная опция «передать этот флаг в postgres» на странице руководства (первая ссылка, которую я включил).

Мои тесты не запускали это с помощью docker compose, это было в командной строке с использованием параметра -e. Однако это та же самая концепция; «среда» в docker compose — это -e в командной строке. А именно:

https://docs.docker.com/engine/reference/commandline/run/

--env , -e Установить переменные среды

Тест № 1 только с установленным паролем env:

docker run -e POSTGRES_PASSWORD = тест postgres: последний

Вот вывод запуска по умолчанию:

postgres@cbf23636dabc:~$ psql
psql (13.4 (Debian 13.4-1.pgdg100+1))
Введите "помощь" для помощи.

postgres=# \l
                                 Список баз данных
   Имя | Владелец | Кодирование | Разобрать | Тип | Права доступа   
-----------+----------+-----------+------------+--- ------------------------+-----------------------
 постгрес | постгрес | UTF8 | en_US.utf8 | en_US.utf8 | 
 шаблон0 | постгрес | UTF8 | en_US.utf8 | en_US.utf8 | =с/постгрес +
           | | | | | postgres=CTc/postgres
 шаблон1 | постгрес | UTF8 | en_US.utf8 | en_US.utf8 | =с/постгрес +
           | | | | | postgres=CTc/postgres

Тест № 2, с установленными выше переменными окружения в предложенном докере композицию только в CLI:

docker run -e POSTGRES_PASSWORD=test -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --lc-collate=C --lc-ctype=C' postgres:latest

И затем вывод:

postgres@b6b80c876f3e:~$ psql 
psql (13.4 (Debian 13.4-1.pgdg100+1))
Введите "помощь" для помощи.

postgres=# \l
                             Список баз данных
   Имя | Владелец | Кодирование | Разобрать | Тип | Права доступа   
-----------+----------+-----------+---------+------ -+--------------------------------------
 постгрес | постгрес | UTF8 | С | С | 
 шаблон0 | постгрес | UTF8 | С | С | =с/постгрес +
           | | | | | postgres=CTc/postgres
 шаблон1 | постгрес | UTF8 | С | С | =с/постгрес +
           | | | | | postgres=CTc/postgres

Обратите также внимание на раздел на официальной странице образа Postgresql Docker, где описаны сценарии инициализации. Это то, на что вы также можете обратить внимание.

Philipp avatar
флаг in
Спасибо. Я впервые работаю с PostgreSQL. Я не знал, как работает создание базы данных в деталях.
флаг cn
Без проблем! Postgres немного медвежонок, но я бы определенно посоветовал найти графический интерфейс для работы с ним, если вы можете. Есть несколько вариантов, хотя мой личный фаворит — pgAdmin. Открытый источник.
Рейтинг:0
флаг cn
xji

Я попробовал подход, описанный выше, и еще одна проблема, с которой я столкнулся, заключалась в том, что в базе Debian по умолчанию, которая поставляется с официальным образом Postgres Docker, не установлены какие-либо другие языки.

# локаль -a
С
C.UTF-8
en_US.utf8
POSIX

Чтобы установить другой язык, например. Китайский, нужно было запустить например. localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8.

Затем сработала установка переменных среды.

Из-за этой необходимости кажется, что образ Postgres по умолчанию не удовлетворяет всем требованиям, и было бы лучше создать собственный образ, как описано в документации. в этом посте.

ОТ постгреса
RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV ЯЗЫК zh_CN.utf8

затем docker build -t ваше-настраиваемое-имя-изображения.

Затем вы можете использовать пользовательское изображение в своем докер-compose.yml вместо официального изображения postgres, без необходимости дополнительной установки какой-либо переменной среды.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.