Alex
Привет всем. Коллеги помогите разобраться, я уже более трех дней пытаюсь решить одну проблему
Alex
У меня есть контейнер в котором крутится liquidsoap (фреймворк для генерации медиа потоков). Возникла потребность из liqudisoap вызывать скрипт на питоне и записывать данные о композиции которая сейчас играется. Выглядить это так. system ("python3 ./scripts/test.py \"#{artist}\" \"#{title}\"") system это API метод liuidsoap Скрипт на питоне принимает два аргемента и записывает и в JSON и тут у меня началась пляска с бубном. Латинский алфавит не вызывает проблем, как только дело дошло до композиций с кириллицей возникла ошибка UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) Я шаманил над кодировкой и в итоге раскрутил проблему до того, что в докере установил locale LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=ru_RU.UTF-8 Однако это не помогло мне решить проблему. Я пытался кодировать строки в utf-8 прямо внутри питоновского скрипта, все тщетно. Валится другая ошибка UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd0' in position 0: surrogates not allowed Кодировка терминала внутри докера utf-8, проверял с помощью питоновского метода из модуля sys. `sys.stdin.encoding Помогите разобраться, ибо я уже отчаялся и думаю о том, что бы изменить логику сохранения строк на киррилице...
Alex
Забыл упомянуть, что если вызвать скрипт ручками и передать в качестве аргументов строки на кириллице, проблема не наблюдается.
Aleksandr
Пример json покажи
Aleksandr
Нерабочий пример
Bogdan (SirEdvin)
У меня есть контейнер в котором крутится liquidsoap (фреймворк для генерации медиа потоков). Возникла потребность из liqudisoap вызывать скрипт на питоне и записывать данные о композиции которая сейчас играется. Выглядить это так. system ("python3 ./scripts/test.py \"#{artist}\" \"#{title}\"") system это API метод liuidsoap Скрипт на питоне принимает два аргемента и записывает и в JSON и тут у меня началась пляска с бубном. Латинский алфавит не вызывает проблем, как только дело дошло до композиций с кириллицей возникла ошибка UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) Я шаманил над кодировкой и в итоге раскрутил проблему до того, что в докере установил locale LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=ru_RU.UTF-8 Однако это не помогло мне решить проблему. Я пытался кодировать строки в utf-8 прямо внутри питоновского скрипта, все тщетно. Валится другая ошибка UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd0' in position 0: surrogates not allowed Кодировка терминала внутри докера utf-8, проверял с помощью питоновского метода из модуля sys. `sys.stdin.encoding Помогите разобраться, ибо я уже отчаялся и думаю о том, что бы изменить логику сохранения строк на киррилице...
1. В скрипте кодировка указана? 2. Пробовали PYTHONIOENCODING?
Alex
1. В скрипте кодировка указана? 2. Пробовали PYTHONIOENCODING?
1. В скрипте не указана, но я пробовал. 2. Уже назначил эту переменную. Еще вчера, не помогло.
Alex
Нерабочий пример
Не рабочий это не совсем верно сказано. Сейчас.
Alex
@zelenin видимо после моих опытов с локалью скрипт не отрабатывает совсем и вываливается в одну из ошибок, которые я описал выше. Конкретно эта ошибка UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd0' in position 0: surrogates not allowed Что было в JSON? Вместо кириллических символов были строки вот с подобным содержимым \udcd0, то есть запись в файл происходила, однако когда скрипт запускался повторно он должен проверять json, и дописывать туда значения. Так вот на этапе парсинга файла скрипт вываливался с ошибкой которую я описал выше. Я думал скрипт некорректно отрабатывать, однако в латинскими значениями таких проблем не было
Aleksandr
Кириллических символов как раз быть не должно
Aleksandr
Юникод эксейпится в \u....
Aleksandr
Но конкретно dcd0 - это суррогат, и скорее всего из-за экспериментов с кодировками вылез
Alex
Кириллических символов как раз быть не должно
Эх, ничерта не пониманию в кодировках. Теперь буду восполнять пробел знаний. Касательно решения конечно я расстроился :) Три дня боролся, думал победить.
Alex
Кириллических символов как раз быть не должно
Однако мне не понятно почему при запуске скрипта напрямую с передачей кириллических строк, json формируется норм.
Aleksandr
Приходит не в юникоде, читается как юникоде, соответственно кодируется в непонятно что
Alex
А, так может не в юнмкоде приходит кириллица когда внутри скрипта?
Конечно я это предусмотрел и внутри скрипта проводил вивисекцию строк :) Как я их только не пытался кодировать, декодировать и записывать...
Alex
Логика в этом определенно есть, но я пытался :)
Alex
А можно с помощью баша строку строку перед передачей скрипту на питоне перекодировать и через конвеер передать? Вообще баш такое сможет сделать?
Aleksandr
Перекодировать из чего во что? Питон и сам сможет
Alex
Ну вот из чего у меня до сих пор нет 100% уверенности, а вот в utf-8 я б эти строки перекодировал.
Aleksandr
Как поймёшь из чего, так и в питоне сделаешь
Alex
Вот ведь проблема не в json, а в том, что даже в обычный файл записать не могу :) Ну в смысле в режиме "w", наверное в бинарном режиме записи все будет ок
Aleksandr
Байтики прочти да загугли
Alex
Anonymous
Омг
Aleksandr
Откуда получаешь текст?
Alex
От другого сервиса - Liquidsoap
Aleksandr
Через апи?
Aleksandr
Live harbor - Bad song title encoding only harbor · Issue #411 · savonet/liquidsoap https://github.com/savonet/liquidsoap/issues/411
Alex
Ну не совсем. Я через апи вызываю метод внутрь которого можно передать любую команду линуксовую.
Alex
Выглядит это вот так def new_track(m) = artist = m["artist"] title = m["title"] system("echo ============= \"#{artist}\" - \"#{title}\" =============") system("python3 ./scripts/last_10_songs.py \"#{artist}\" \"#{title}\"") end
Aleksandr
Эту проблему решил очень давно.
Ну возможно не полностью. Эта же проблема с кодировками в аудиозаписей тянется с 90х еще
Alex
http://radio-mustdie.ru/
Alex
Вот сейчас играет трек с кириллицей в названии.
Alex
Тут другая проблема, я уверен
Aleksandr
я уверен что эта
Alex
Ну я могу разьве что написать ишью на гитхаб ибо конкретно моя ситуация не рассматривается нигде.
Aleksandr
ты эти две переменные возьми, да конвертни в байтики. и загугли в какой кодировке эти символы соответствуют этим байтам
Aleksandr
так определишь что за кодировка тебе приходит
Aleksandr
про кириллицу речь конечно
Aleksandr
вангую, что там iso8859-x
Alex
Да, я вот к этому хочу вернуться. Буду в этом направлении ковыряться.
Alex
Вам интересно узнать ответ на эту загадку? :)
Aleksandr
пиши)
Alex
Но это уже завтра, я сейчас не в состоянии :) Спасибо огромное за отклик :) Жаль нельзя в телеграме рейтинг добра людям повышать, повысил бы тебе :)
Ivan
Всем привет! А есть кто нибудь, кто в matchbox и CoreOS хорошо шарит? Есть такая задача: Есть вот такой игнишн-конфиг https://gist.github.com/beatlejuse/9599abd6019f401b1ae36e3f99d51186 в нём сертификаты вшиты в user_data и после заливки CoreOS остаются в нём в открытом виде. Что то я никак не найду способ, как заливать их не через user_data пробовал создавать их на уровень выше (как /opt/installer ) но пос ле установки CoreOS и перезагрузки ничего не сохраняется(( Подскажите, как сделать грамотно?
paulwinex
приветы. небольшой вопрос. Есть образ готовый, там чото мутится своё, работает какойто сервис https://hub.docker.com/r/vimagick/pure-ftpd/ Мне нужно наследоваться от этого образа, не менять его CMD или ENTRYPOINT, а только запустить еще пару команд и добавить порт. ВОпрос собсна в чем, когда делаю свой Dockerfile с парой строчек типа EXPOSE и ADD, всё билдится норм, но образ потом закрывается сразу после старта, какбудто удалилась команда. Копирование последней строки из оригинала так же не помогает. Как же наследоваться в таком случае? Спасиб.
paulwinex
мне тут в личке помогли немного, пока пошел разбираться
paulwinex
ничего не решили кроме почти почитать доку пока что
paulwinex
но если просто контейнер запустить то сервис работает норм
Aleksandr
покажи dockerfile
Nikita
Господа, добрый день. Возникла необходимость в автоматизации написания конфигов для реверс-прокси nginx + ssl от let's encrypt. Воспользовался решением от товарища jwilder. Есть у него три контейнера, nginx официальный, nginx-gen, который используя шаблон конфиг формирует, глядя на определённые переменные окружения других контейнеров и letsencrypt-отвский контейнер, который сертификаты запрашивает. Да, ставил в конфигурации из трёх отдельных контейнеров. Всё работает, ровно до первого перезапуска хоста. Потом контейнеры поднимаются, всё ок, но никаких конфигов nginx-gen не правит. Да и с работоспособностью этого решения в нескольких сетях - серьёзные вопросы. Подскажите, мне стоит копать дальше это решение? Или есть что-то более слаженное, что используется в подобных случаях? Нужен реверс-прокси автоматический с ssl. В принципе, описанное выше решение вполне устраивало, если бы работало стабильно. Буду очень благодарен за любую наводку.
Bogdan (SirEdvin)
Можно попробовать как-то так: https://manas.tech/blog/2016/01/25/letsencrypt-certificate-auto-renewal-in-docker-powered-nginx-reverse-proxy.html Правда, без переконфигурации, а чисто открыть папку .well-known миру
Nikita
Собственно, инструкция и отсылает к работам jwilder
Nikita
Юзается docker-gen со ссылкой на проект jwilder, где в конце он сам предлагает использовать его nginx-proxy, который я описал выше. Т.е. используется именно этот механизм и мне не стоит дёргаться куда-либо в сторону, верно?
Bogdan (SirEdvin)
Хм ... опять я невнимательно читал. Суть в том, что можно выкинуть nginx-gen, например, при помощи того что используется для настройки сервером (у меня ansible) и чисто прокидывать папку для lets encrypt наружу. Или, если совсем кластер, то consul-template или confd
Denys
https://docs.traefik.io/
Denys
Очень просто решает проблему с летсенскрипт
Denys
Может оно подойдёт
Mike
Всем привет
Mike
Пытаюсь в https://hub.docker.com/r/yandex/clickhouse-server/ просунуть users.xml запускаю это чудо докер композом, прописал в volumes из хомы users.xml абсолютным путём. делаю docker-compose restart и никаких ошибок нет, при заходе в контейнер файл остался старым, что не так?
Mike
не вижу кода
version: '2' services: web: build: ./ command: dockerize -wait tcp://db:9000 /proj/bin/click-stat -click-url=tcp://db:9000/ depends_on: - db restart: unless-stopped environment: VIRTUAL_HOST: subdomain.domain.com db: image: yandex/clickhouse-server volumes: - /var/stor/stat/db:/var/lib/clickhouse - /home/aquah/projName/users.xml:/etc/clickhouse-server/users.xml ports: - 8091:8123 restart: unless-stopped
Denys
На какой ОС делаешь?
Mike
дебиан 9, это имеет значение?
Aleksandr
если с путями или файлом не напутал, тогда попробуй docker-compose stop, docker-compose rm, docker-compose up -d
Denys
Просто под виндой и маком могут быть проблемы из за фаервола
Mike
да, сработало
Mike
но почему
Mike
docker-compose stop потом build потом restart не помогал?
Aleksandr
контейнер старый загружался, видимо еще без прописанного волюма. бывает
Mike
что значит бывает
Mike
это код а не толпа бабок у подъезда
Aleksandr
ответ на свой вопрос можешь найтив доке