gifts2017

Создаем Docker-контейнер с 1C-клиентом для Linux

Опубликовал b00t b00t (b00t) в раздел Администрирование - Системное

Создаем Docker-контейнер для Linux-версии 1C. Например, чтобы беспрепятственно использовать его на любом Linux дистрибутиве и не держать при этом "дремучих" версий библиотек в системе.

Наверняка каждый из вас, кто использовал 1С клиент на linux, особенно отличном от ubuntu/debian/redhat/centos сталкивался с ворохом проблем (от версии ImageMagic и "странного", если не сказать грубее, использования библиотек до всевозможных "блуждающих глюков", при использовании библиотек, новее, чем доисторические). В статье предлагается один из вариантов решения этих проблем, с использованием Docker. (https://ru.wikipedia.org/wiki/Docker)

Полученный в результате Docker-контейнер построен на базе ubuntu 14.04, включает mscorefonts ( набор стандартных шрифтов от MS; лицензия отличается от LGPL, текст лицензии внутри архива mscorefonts.zip), патчи infinality (для "правильного" рендеринга шрифтов), шрифт Fira Code (хороший, моноширный шрифт для кода)

В репозиторий добавлена light-версия Dockerfile (без тем, шрифтов, infinality, только mscorefonts), находится в директории light.

Прежде всего устанавливаем Docker, например для Arch Linux:

pacman -S docker
gpasswd -a <username> docker
systemctl enable docker
systemctl start docker

Клонируем репозиторий со скриптами, и открываем Dockerfile для настройки:

git clone https://github.com/psyriccio/dck1c.git
cd dck1c
# cd ./light # если нужно взять за основу light-версию
nano ./Dockerfile

Можно избавиться от этих строк (это темы оформления, чтобы докер-приложение смотрелось как родное в системе, можно заменить на свои, распаковываются в /usr/share/themes и /usr/share/icons соответственно):

&& unzip /opt/zukitwo-themes.zip -d /usr/share/themes \ 
&& unzip /opt/yltra-icons.zip -d /usr/share/icons \ 
&& unzip /opt/ultraflat-icons.zip -d /usr/share/icons \ 

В следующих строках указываем версию и архитектуру платформы и кодировку:

ENV PLT_VERSION 8.3.7-1873 
ENV PLT_ARCH amd64 
ENV LANG ru_RU.utf8 

Размещаем в директории ./distr официальные deb-пакеты, соответствующих версий и архитектуры (нужны server, common и client). Запускаем сборку контейнера коммандой:

docker build -t psyriccio/dck1c .

Сборка займет какое-то время. После сборки можем запускать контейнер скриптом ./run.sh или коммандой вида:

docker run -t --rm -e DISPLAY -v $HOME/.Xauthority:/home/user/.Xauthority -v $HOME:/home/user -v /mnt:/mnt --net=host --pid=host --ipc=host psyriccio/dck1c

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Евгений Сосна (pumbaE) 14.09.16 09:19
а если еще добавить туда установку mono и oscript плюс https://github.com/oscript-library/deployka и получаем удобный обновлятор из хранилища серверной базы, с блокировкой пользователей, с завершением сессий и т.д. и т.п.
Berckk; sorb; artbear; JohnyDeath; b00t; hawk911; Pr-Mex; +7 Ответить 1
2. b00t b00t (b00t) 14.09.16 11:02
(1) pumbaE, хорошая, кстати, идея.
На досуге добавлю, спасибо за мысль правильную.

Проект открытый, лицензия LGPLv3, так что можно смело добавлять и другие "необходимости", форкнув репозиторий или же прислав мне pull-request.
3. Артур Аюханов (artbear) 14.09.16 12:10
А доступ к лицензиям как организован?
4. Евгений Сосна (pumbaE) 14.09.16 12:32
(3) artbear, человек пробрасывает все в контейнер, поэтому если ключ есть он определяется, если hasp сетевой то тоже лицензия найдется. Хотя можно и просто пробросить сокет хаспа /tmp/=askusb (как то так, по памяти) и ключ автоматом локальный определится, без проброса сети.
5. Сан Саныч (herfis) 14.09.16 13:08
git clone git@github.com:psyriccio/docker1c.git

пишет

Клонирование в «docker1c»…
Permission denied (publickey).
fatal: Could not read from remote repository

Ежели чо - ногами не пинать. Я в ентом деле не настоящий сварщик.
6. b00t b00t (b00t) 14.09.16 13:13
(3) artbear, всё верно уже за меня ответили, расскажу чуть подробнее. Если контейнер запускается с аргументом --net=host, то он "видит" сеть, от лица хост-системы, т.е. если хосту доступен сетевой ключ -- его увидит и 1С в контейнере.
Или можно пробросить файл-сокет локального ключа, используя аргумент -v <что-то снаружи>:<что-то внутри>.
Контейнер собирается из deb-пакетов 1С-клиента, которые вы ему положите в директорию ./distr, предполагается, что вы положили туда официальные, лицензионные пакеты и у вас есть право на их использование. В целом я использую этот контейнер с обычным сетевым ключом, который отлично видится внутри контейнера. С пробросом локальных ключей тоже не должно быть проблем, у меня нет под рукой ключа, проверить не могу, но в принципе могу проконсультировать в какую сторону копать, если у кого-то не заработает.
7. b00t b00t (b00t) 14.09.16 13:17
(5) herfis, попробуйте
git clone https://github.com/psyriccio/docker1c.git

у вас git пытается авторизоваться по какому-то ключу, который естественно авторизован быть не может
исправлю сейчас в тексте, это моя оплошность, лучше по https забирать
8. b00t b00t (b00t) 14.09.16 13:22
(4) pumbaE, всё верно, с ключами проблем не должно быть, тестировал на сетевом, локальный можно пробросить примерно как вы и описали
9. Сан Саныч (herfis) 14.09.16 13:23
(7) b00t, Есть контакт, спасибо.
10. Данила Володькин (skif47) 14.09.16 14:44
Плюсую.
А еще можно через docker-compose поднять сразу целый стек контейнеров с postgresql, apache и еще какой-нибудь приблудой рядом ))
https://github.com/volodkindv/environment/tree/ver2
11. b00t b00t (b00t) 14.09.16 15:09
(10) skif47, отлично, веб-сервисы 1С-ные вообще вне контейнера использовать на таком старом apache, как минимум не безопасно. Неплохая среда для разработки/тестирования вырисовывается, что-то поломалось -- удаляем контейнер и разворачиваем новый. В моем контейнере есть 1С-сервер (зачем-то прописан в зависимостях у пакета client), вообщем-то ничего не мешает стартануть этот контейнер, как 1С сервер, предварительно его настроив конечно. Postgres есть в стандартом docker-hub в изобилии, есть даже пропатченная 1Сными патчами версия, как-то запускал ради интереса -- работает.
12. Сан Саныч (herfis) 14.09.16 16:22
Образ собрал, запустил - работает!
Несколько вопросов:
1) при запуске 8-ка выкидывает в консоль два идентичных ворнинга вида
WARNING **: Couldn't connect to D-Bus system bus, Could not connect: No such file or directory
Чтобы это могло означать и на что это может повлиять?
2) перед завершением работы контейнера выкидывает
error: list of process IDs must follow -p
и потом справку по использованию ps
3) как я понял, в качестве побочного эффекта локальный кэш конфы 1С каждый раз заново создается? Я пока не решил, хорошо это или плохо :) С одной стороны - гарантия от сбойного кэша. С другой стороны - запуск занимает приличное время на средней тяжести конфе.
13. b00t b00t (b00t) 14.09.16 16:28
(12) herfis, первое - ругается на отсутствие dbus, который для 1С не нужен, был бы нужен, если бы решили передавать GTK-сообщения на хост систему, например.
Второе -- нужно немного скрипт запуска допилить, он проверяет периодически не завершился ли процесс 1С-клиента, и последняя проверка, когда он уже завершился происходит, когда в переменной $! (pid последнего запущенного процесса, по стандартам POSIX) уже пусто, скрипт останавливается -- контейнер тоже. Т.е. обе первые ошибки можно игнорить, это не ошибки, нужно в скрипте их "съесть" /dev/null-ом
Да, кеш пока в тестовом режиме (чтобы рабочий не порушить) пересоздается, отключить можно закомментировав соответствующие строки в скрипте запуска, ну думаю вы разобрались, если спрашиваете
В планах вынести это в опцию при сборке контейнера.
14. Евгений Сосна (pumbaE) 14.09.16 16:28
(12) herfis,
1.
WARNING **: Couldn't connect to D-Bus system bus, Could not connect: No such file or directory

для 8 это не имеет значения.
3. Если запускать как в run.sh указано, то у вас должен по пути ~/.1cv82 создаться каталог, где и будет кэш храниться и список баз тоже, ну а если не пробрасывать туда ~/.1cv82 тогда да, кэш будет создаваться каждый раз заново.
15. b00t b00t (b00t) 14.09.16 16:33
(12) herfis, надо наверное добавить ответы на вопросы, которые сегодня обсудили в описание.
В скриптах ещё простор для "допиливания", конечно, я подпилю на досуге найденные шероховатости, или можете смело присылать реквесты сами.
16. Сан Саныч (herfis) 14.09.16 16:37
(14) pumbaE, Время с начала запуска и до появления окна авторизации проходит одинаково долгое как при запуске скриптом, так и без.
17. b00t b00t (b00t) 14.09.16 16:48
(16) herfis, ну нужно учитывать, что запуск самого контейнера тоже занимает какое-то время, это конечно не загрузка системы, но всё-же. Если хочется быстро, можно сделать версию когда контейнер стартует один раз, в нем стартует systemd или какой-нибудь планировщик. Затем клиенты нужное количество раз запускаются внутри этого контейнера. Будет быстрее, экономичнее, но это противоречит "docker good prractice". Данный контейнер делался как среда для разработки -- запустил и на весь день конфигуратор, в котором если запускать 1С-клиенты в режиме отладки, то они запускаются, естественно, в том же контейнере, что и конфигуратор. Соответственно время запуска не отличается от времени запуска 1С на хосте. Но если запускать-останавливать контейнер каждый раз -- добиться быстрого времени запуска не получится, можно конечно стрипнуть из образа всё лишнее, уменьшив его размер и оптимизировать немного сборку (не пихать например deb-пакеты в образ, потом их удаляя (инноды UFS/btrfs не освобождаются всё равно), а ставить эти пакеты из источника, подключенного к контейнеру из вне, например из отдельного data-контейнера. Но всё равно будет ощутимая разница во времени запуска. Чудес не бывает. docker конечно гораздо легче, чем скажем virtualbox vm, но всё же -- это виртуализация, эдакий очень умный chroot, проксирующий всё и вся, включая вызовы к ядру.
18. Сан Саныч (herfis) 14.09.16 16:49
(15) b00t, Ну, это все фигня на фоне мировой революции. Публикации безоговорочный плюс.
Вопрос такой: это публикация в качестве примера использования технологий, или планируете ее в продакшене у себя использовать и допиливать по необходимости?
19. Сан Саныч (herfis) 14.09.16 16:51
(17) b00t, Не-не-не. Сам контейнер стартует сравнительно быстро (пару секунд). Речь о времени между выбором запускаемой базы и появлением окна авторизации этой базы (поиск лицензий отпадает, т.к. лицензии выдаются сервером и поиск их по сети отключен).
20. b00t b00t (b00t) 14.09.16 16:55
(18) herfis, я её уже использую в продакшене и буду конечно допиливать. Дело в том, что у меня на всех рабочих станциях и дома и на работе arch linux, выхватив очередные проблемы с обновившейся библиотекой или просто прекращением работы на ровном месте -- родилось такое вот решение. В общем-то проблему это решило, допиливать конечно есть что. Ну и увидев, что публикаций на эту тему довольно мало, я решил опубликовать эту "заметку", будет время добавлю сюда описание всех нюансов, в том числе которые сегодня обсуждали, тогда может можно будет назвать это статьей. ))
21. b00t b00t (b00t) 14.09.16 16:59
(19) herfis, а ну тогда нужно посмотреть, логи поковырять, я думаю мест для оптимизации ещё предостаточно. Это, скажем так быстрое решение. Не "наколеночное" конечно, но ещё сыровато. Как минимум подрезать образ с 2Gb до 1.5?, а то и 1Gb думаю вполне реально. А так же посмотреть что происходит с 1С при запуске, возможно долго инициализируется кэш, возможно нужно повыносить что-либо из контейнера на хост-систему, а то и в ram-disk
22. Сан Саныч (herfis) 14.09.16 17:01
Упс. Вопрос снимается. Сам дурак. Запуск происходит быстро, просто у меня окно авторизации почему-то открывается позади первого окна, а не поверх, и создается иллюзия продолжения запуска. Это к сборке не относится.
23. b00t b00t (b00t) 14.09.16 17:05
(19) herfis, кстати, вполне возможно, я на своей dev-станции на core i5 с 16G памяти, SSD, а так же /tmp /var/cache в tmpfs на ram-диске просто не чувствую "проблему", надо будет запустить на машине по слабее.
24. b00t b00t (b00t) 14.09.16 17:06
(22) herfis, бывает. с 1С вообще всякое бывает. но всё-равно есть что оптимизировать
25. Сан Саныч (herfis) 14.09.16 17:13
(24) b00t, Не вижу смысла в тонких оптимизациях и снижении размера образа. Два гига или один - абсолютно непринципиально. А скорость старта контейнера и сейчас высокая. Лучше потратить дорогое время специалиста на что-то более существенное и интересное с практической точки зрения :)
26. b00t b00t (b00t) 14.09.16 17:23
(25) herfis, я в свое время создавал очень маленький docker контейнер с arch linux, очень много раз потом пригодился. Но 1С, сами понимаете -- принципиально на ubuntu собрана, т.к. она настолько гвоздями к системе прибита, что сам контейнер и создавался, ради возможности запуска на других linux-ах. Ну да, проектов много, я вообще, признаться честно не 1С-ник, просто бывают разные проекты и работы. По поводу 1С есть ещё несколько смежных проектов по мере превращения чего-либо в более-менее интересный вид -- может быть ещё опубликую что-нибудь необычное.
27. Алексей Лустин (lustin) 18.09.16 20:38
28. b00t b00t (b00t) 19.09.16 02:09
(27) lustin, кстати, да! Я как-то читал это уже, но, представляете -- вылетело из головы. Большое спасибо, что напомнили. Не люблю "копирастов", ведущих себя подобным образом, при этом они могут заюзать с десяток-другой технологий открытых, а потом -- "А знаете, что вы имя наше не используйте и иконку уберите из репозитория", так ещё и помни о каждом. А не собрать ли мне этот контейнер чисто на LXC
asolokha; +1 Ответить
29. Сан Саныч (herfis) 19.09.16 10:25
(27) lustin, ИМХО, подняли бурю в стакане воды. Очевидно, что это просто юристы перестраховались на случай реальной необходимости защиты торговой марки. Но осадочек оставляет, да.
Думаю, как только поднимется хайп по реальному прецеденту, буде он возникнет, требования конкретизируют и либерализируют. Не идиоты же они, в конце-концов.
30. Александр Прокопенко (alprk) 17.10.16 11:38
Здорово! Вот бы еще билд-скрипт сам умел качать нужный релиз с сайта.
32. b00t b00t (b00t) 17.10.16 21:41
(31) Infactum, всё верно, образ оптимизировался чуть менее, чем нисколько.
Размер docker образа вообщем-то не имеет значения, если вы используете другие контейнеры на той же основе (я вообщем-то не использую debian/ubuntu, так что в моих условиях оверхед есть). Возможно на досуге займусь оптимизацией, если желание и время появится. 1С редко приходится запускать, для какой-нибудь интеграции с какой-нибудь разрабатываемой системой. У меня на всех машинах, что дома, что на работе arch linux, а 1С на чём-нибудь отличном от ubuntu или windows -- это боль и печаль (кстати на 12.04 она показала себя в работе хуже, чем на более свежей -- вылеты, обгрызанные шрифты несмотря на infinality, лаги редактора форм в конфигураторе, "залипания" окна с подсказкой по синтаксису или параметрам, оно просто не пропадает, а остается до перезапуска и куча всего подобного, сразу и не вспомню, так что не знаю что там у них официально поддерживается, я пытался сделать то, что работает)
По поводу репозитория локального -- он конечно должен быть всегда под рукой, но этот путь в данном случае не многим лучше моего "на скорую руку". Верный путь это собрать часть образа с 1С, библиотеками и прочим вообще снаружи контейнера в какой-нибудь squash-fs, выпилить оттуда всё лишнее, затем взять базовый образ ubuntu развернуть, выпилить лишнее и от туда, выгрузить UFS в образ, упаковать её и оптимизировать и склеить в одну транзакцию. Затем загрузить этот образ в новый контейнер, запустить и подмонировать squash, создав сим- или хардлинки в нужные места файловой системы. /tmp /home /var и прочую "динамику" в tmpfs в ramdisk или монтировать из вне, с хост-системы. Кто знает, если вдруг случится со мной проект, работая над которым придется чаще запускать 1С -- я, может быть, "психану" штуковиной, подобной описанному выше. Ну или кто-нибудь другой)
33. Евгений Сосна (pumbaE) 17.10.16 21:43
(31) Infactum, за curl grep login - лайк.
К сожалению https://hub.docker.com/r/daald/ubuntu32/tags/ уже долгое время не обновляет базовые образы, даже не смотря на то, что он принял мой pull request https://github.com/daald/docker-brew-ubuntu-core-32bit/pull/1
Так что в дальнешем планирую наверное самому собрать свой image.
Плюс я бы посоветовал добавить установку xvfb-run, тогда не будет проблем с запуском конфигуратора в коммандном режиме.
Для установки из репозитария, советую посмотреть на aptly для организации своего deb сервера утилита чудесная.
34. b00t b00t (b00t) 17.10.16 21:48
(31) Infactum, а ещё очень правильно было бы использовать prelink в этом контейнере, причем настроив его руками под это дело, а то и подготовив prelink-образ ручками.
37. b00t b00t (b00t) 17.10.16 22:40
(36) pumbaE, ну как бы смотрите -- доступ на сайт ограничен (привет не только копирастам, но и 272 статье УК РФ).
Доступ осуществляется на платной основе, по договору ИТС, в договоре по мимо всего прочего есть запрет на передачу своего логина пароля третьим лицам, но и запрета этого не нужно на самом деле.
А на деле получается, что некто (возможно находясь в преступном сговоре) предоставил доступ к ресурсу, лицу, которое на такой доступ права не имело. В случае скрипта в репозитории -- массово, т.е. вы предоставили доступ к платному ресурсу "неопределенному кругу лиц", читайте "публичный доступ". Тут даже в мире Linux не все гладко, вы думаете просто так ни один пакетный менеджер без дополнительных "хаков" не поставит в автоматическом режиме oracle-java-jdk или mscorefonts который, кстати zip-архивом у меня в репозитории лежит, хоть и с лицензией внутри, но я на самом деле должен у пользователя явно спросить, выкатив лицензию, типа подпишешь -- продолжим, а не подпишешь -- exit(0) отсюда! Любой юрист вам прояснит, что дело тут пахнет жареным, в плане дать кому-то логин пароль от users.v8.1c.ru, просто особо дела нет кому-то до этого, но внезапно всё может измениться, например, если ваш скрипт станет популярным или нужен будет показательный процесс-порка, ну или просто "нужный" дядя заскучает на работе. Одному знакомому была серьезно испорчена карьера в США, закончилось даже потерей работы и приездом назад в РФ в итоге. Безопасники случайно нарыли небольшую гору "компромата для копираста", чувак разработал эмуль какого-то ключа, от финансовой аналитической системы, причем чисто технически, сам не использовал, не продавал, просто лежали "исследовательские материалы" в репозитории, про который тот уже и забыл за давностью лет. Поэтому я не рекомендую столь халатно относиться к этому вопросу. И вообще -- мир, дружба, opensource!
38. Евгений Сосна (pumbaE) 17.10.16 22:52
(37) b00t, мені всеодно на "272 статье УК РФ".
В скрипте есть возможность указать свои логин и пароль для доступа на итс.
39. Егор Иванов (Infactum) 18.10.16 06:09
(37) b00t, я вот не пойму что вы панику развели.
Никто никакие пароли в общей доступ не выкладывает, как и дистрибутивы. Существующий скрипт просто позволяет вам скачать дистрибутивы нужно версий, если у вас есть на то права (доступ к сайту). Сами пароли нигде сохранены не будут, они исчезнут вместе с параметрами окружения, как только закроете сессию терминала.
Вот если бы я сейчас стал собранный образ в публичный docker hub выкладывать - другой разговор.
(32) b00t, (33) pumbaE, когда я говорил про локальный repo - речь не шла об использовании его на постоянной основе (хотя для внутренних задач компании может и пригодился бы). Речь о том, что вместо предварительной установки зависимости руками и далее dpkg -i клиента/сервера 1С в нужном порядке можно сделать примерно так:
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz \
mkdir -p /etc/apt/sources.list.d \
echo deb file:/tmp ./ > /etc/apt/sources.list.d/onec.list \
apt-get update \
apt-get -y --force-yes install 1c-enterprise83-client
...Показать Скрыть
40. b00t b00t (b00t) 18.10.16 09:22
Никакой паники, я просто подумал, что используется какой-то определенный логин/пароль, а не спрашивается у пользователя.

(39) Infactum, локальный репозиторий -- очень удобно, да конечно в первую очередь для компании.
Да я понял что вы предлагаете и предложил ещё более оптимизированный способ. Так и быть, если проснувшийся спортивный интерес к выходным не иссякнет -- сделаю то, о чем написал выше.
41. Артур Аюханов (artbear) 18.10.16 14:44
Куда подевались 35 и 36 ?
было что-то полезное? что за скрипт обсуждался?
42. Егор Иванов (Infactum) 18.10.16 14:49
(41) artbear, надо же, ссылку на мой гитхаб грохнули. Хотя ничего криминального там нет: альтернативная реализация сборщика docker образа, которая умеет сама качать дистрибутивы помимо прочего. Все легально (такой же функционал есть почти во всех конфигурациях для франчей), но похоже модераторам было лень разбираться.
43. b00t b00t (b00t) 18.10.16 23:32
(42) Infactum, ну если там был просто скрипт сборки и при этом репозиторий не содержал: какого-либо логина/пароля для доступа или ссылки на место где их взять, готового образа вместе с 1С, ну или ссылки на него -- то действительно непонятно, почему потёрли, ели же что-то из вышеперечисленного всё же есть в репозитории, даже если пользователю предлагается ввести свои логин и пароль -- то это как раз та ситуация, о которой я и писал, убеждая всё же быть немного осторожнее.
44. Егор Иванов (Infactum) 19.10.16 06:25
(43) b00t, а вы стало быть так активно вели обсуждение, даже не заглянув туда? 100 строк кода изучить - много времени не надо.
Тем не менее предлагаю спросить мнения людей, которые в отличие от модераторов могут прочитать Dockerfile и скрипт на баше. А то уже не первый раз такая ситуация с тем, что трут полезную информацию.
artbeaer, pumbaE?
45. Евгений Сосна (pumbaE) 19.10.16 08:55
(44) Infactum, я уже высказался лакам и star на github.
46. Артур Аюханов (artbear) 19.10.16 11:40
(44) Я также отметился звездой на гитхабе.
Репозиторий и скрипт абсолютно нормален.
Пользователь вводит свой собственный логин/пароль и получает с сайте 1С только ту информацию, к которой у него лично есть доступ.
никаких нарушений не вижу.
47. b00t b00t (b00t) 21.10.16 23:06
(44) Infactum, я не ваш скрипт активно обсуждал, а способ распространения с предоставлением дистрибутива или доступа на сайт и возможные последствия. Если ваш скрипт не предоставляет ни первого, ни второго -- то сказанное мной его не коим образом не касается. Я не успел изучить ваш скрипт до удаления ссылки на него,, у меня достаточно мало времени и много проектов, а на вопрос "чей логин и пароль использует скрипт?" может ответить и его автор, т.е. -- вы. Если ваш скрипт спрашивает логин пароль у пользователя и качает дистрибутив с официального сайта -- это правильный способ и удобный для пользователя. Я надеюсь я ничем вас не обидел, не упрекайте меня и не обижайтесь, я пишу очень много кода, на разных языках, мой "рабочий" день с 6 утра и до 2-3 ночи, мне действительно не всегда доступно лишнее время для изучения дополнительных 100 строчек кода. Как вас найти на гитхабе?