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




Создаем 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 \r
&& unzip /opt/yltra-icons.zip -d /usr/share/icons \r
&& 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

48 Comments

  1. pumbaE

    а если еще добавить туда установку mono и oscript плюс https://github.com/oscript-library/deployka и получаем удобный обновлятор из хранилища серверной базы, с блокировкой пользователей, с завершением сессий и т.д. и т.п.

    Reply
  2. b00t

    (1) pumbaE, хорошая, кстати, идея.

    На досуге добавлю, спасибо за мысль правильную.

    Проект открытый, лицензия LGPLv3, так что можно смело добавлять и другие «необходимости», форкнув репозиторий или же прислав мне pull-request.

    Reply
  3. artbear

    А доступ к лицензиям как организован?

    Reply
  4. pumbaE

    (3) artbear, человек пробрасывает все в контейнер, поэтому если ключ есть он определяется, если hasp сетевой то тоже лицензия найдется. Хотя можно и просто пробросить сокет хаспа /tmp/=askusb (как то так, по памяти) и ключ автоматом локальный определится, без проброса сети.

    Reply
  5. herfis
    git clone git@github.com:psyriccio/docker1c.git

    пишет


    Клонирование в «docker1c»…

    Permission denied (publickey).

    fatal: Could not read from remote repository

    Ежели чо — ногами не пинать. Я в ентом деле не настоящий сварщик.

    Reply
  6. b00t

    (3) artbear, всё верно уже за меня ответили, расскажу чуть подробнее. Если контейнер запускается с аргументом —net=host, то он «видит» сеть, от лица хост-системы, т.е. если хосту доступен сетевой ключ — его увидит и 1С в контейнере.

    Или можно пробросить файл-сокет локального ключа, используя аргумент -v <что-то снаружи>:<что-то внутри>.

    Контейнер собирается из deb-пакетов 1С-клиента, которые вы ему положите в директорию ./distr, предполагается, что вы положили туда официальные, лицензионные пакеты и у вас есть право на их использование. В целом я использую этот контейнер с обычным сетевым ключом, который отлично видится внутри контейнера. С пробросом локальных ключей тоже не должно быть проблем, у меня нет под рукой ключа, проверить не могу, но в принципе могу проконсультировать в какую сторону копать, если у кого-то не заработает.

    Reply
  7. b00t

    (5) herfis, попробуйте

    git clone https://github.com/psyriccio/docker1c.git

    у вас git пытается авторизоваться по какому-то ключу, который естественно авторизован быть не может

    исправлю сейчас в тексте, это моя оплошность, лучше по https забирать

    Reply
  8. b00t

    (4) pumbaE, всё верно, с ключами проблем не должно быть, тестировал на сетевом, локальный можно пробросить примерно как вы и описали

    Reply
  9. herfis

    (7) Есть контакт, спасибо.

    Reply
  10. skif47

    Плюсую.

    А еще можно через docker-compose поднять сразу целый стек контейнеров с postgresql, apache и еще какой-нибудь приблудой рядом ))

    https://github.com/volodkindv/environment/tree/ver2

    Reply
  11. b00t

    (10) skif47, отлично, веб-сервисы 1С-ные вообще вне контейнера использовать на таком старом apache, как минимум не безопасно. Неплохая среда для разработки/тестирования вырисовывается, что-то поломалось — удаляем контейнер и разворачиваем новый. В моем контейнере есть 1С-сервер (зачем-то прописан в зависимостях у пакета client), вообщем-то ничего не мешает стартануть этот контейнер, как 1С сервер, предварительно его настроив конечно. Postgres есть в стандартом docker-hub в изобилии, есть даже пропатченная 1Сными патчами версия, как-то запускал ради интереса — работает.

    Reply
  12. herfis

    Образ собрал, запустил — работает!

    Несколько вопросов:

    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С каждый раз заново создается? Я пока не решил, хорошо это или плохо 🙂 С одной стороны — гарантия от сбойного кэша. С другой стороны — запуск занимает приличное время на средней тяжести конфе.

    Reply
  13. b00t

    (12) herfis, первое — ругается на отсутствие dbus, который для 1С не нужен, был бы нужен, если бы решили передавать GTK-сообщения на хост систему, например.

    Второе — нужно немного скрипт запуска допилить, он проверяет периодически не завершился ли процесс 1С-клиента, и последняя проверка, когда он уже завершился происходит, когда в переменной $! (pid последнего запущенного процесса, по стандартам POSIX) уже пусто, скрипт останавливается — контейнер тоже. Т.е. обе первые ошибки можно игнорить, это не ошибки, нужно в скрипте их «съесть» /dev/null-ом

    Да, кеш пока в тестовом режиме (чтобы рабочий не порушить) пересоздается, отключить можно закомментировав соответствующие строки в скрипте запуска, ну думаю вы разобрались, если спрашиваете

    В планах вынести это в опцию при сборке контейнера.

    Reply
  14. pumbaE

    (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 тогда да, кэш будет создаваться каждый раз заново.

    Reply
  15. b00t

    (12) herfis, надо наверное добавить ответы на вопросы, которые сегодня обсудили в описание.

    В скриптах ещё простор для «допиливания», конечно, я подпилю на досуге найденные шероховатости, или можете смело присылать реквесты сами.

    Reply
  16. herfis

    (14) pumbaE, Время с начала запуска и до появления окна авторизации проходит одинаково долгое как при запуске скриптом, так и без.

    Reply
  17. b00t

    (16) herfis, ну нужно учитывать, что запуск самого контейнера тоже занимает какое-то время, это конечно не загрузка системы, но всё-же. Если хочется быстро, можно сделать версию когда контейнер стартует один раз, в нем стартует systemd или какой-нибудь планировщик. Затем клиенты нужное количество раз запускаются внутри этого контейнера. Будет быстрее, экономичнее, но это противоречит «docker good prractice». Данный контейнер делался как среда для разработки — запустил и на весь день конфигуратор, в котором если запускать 1С-клиенты в режиме отладки, то они запускаются, естественно, в том же контейнере, что и конфигуратор. Соответственно время запуска не отличается от времени запуска 1С на хосте. Но если запускать-останавливать контейнер каждый раз — добиться быстрого времени запуска не получится, можно конечно стрипнуть из образа всё лишнее, уменьшив его размер и оптимизировать немного сборку (не пихать например deb-пакеты в образ, потом их удаляя (инноды UFS/btrfs не освобождаются всё равно), а ставить эти пакеты из источника, подключенного к контейнеру из вне, например из отдельного data-контейнера. Но всё равно будет ощутимая разница во времени запуска. Чудес не бывает. docker конечно гораздо легче, чем скажем virtualbox vm, но всё же — это виртуализация, эдакий очень умный chroot, проксирующий всё и вся, включая вызовы к ядру.

    Reply
  18. herfis

    (15) Ну, это все фигня на фоне мировой революции. Публикации безоговорочный плюс.

    Вопрос такой: это публикация в качестве примера использования технологий, или планируете ее в продакшене у себя использовать и допиливать по необходимости?

    Reply
  19. herfis

    (17) Не-не-не. Сам контейнер стартует сравнительно быстро (пару секунд). Речь о времени между выбором запускаемой базы и появлением окна авторизации этой базы (поиск лицензий отпадает, т.к. лицензии выдаются сервером и поиск их по сети отключен).

    Reply
  20. b00t

    (18) herfis, я её уже использую в продакшене и буду конечно допиливать. Дело в том, что у меня на всех рабочих станциях и дома и на работе arch linux, выхватив очередные проблемы с обновившейся библиотекой или просто прекращением работы на ровном месте — родилось такое вот решение. В общем-то проблему это решило, допиливать конечно есть что. Ну и увидев, что публикаций на эту тему довольно мало, я решил опубликовать эту «заметку», будет время добавлю сюда описание всех нюансов, в том числе которые сегодня обсуждали, тогда может можно будет назвать это статьей. ))

    Reply
  21. b00t

    (19) herfis, а ну тогда нужно посмотреть, логи поковырять, я думаю мест для оптимизации ещё предостаточно. Это, скажем так быстрое решение. Не «наколеночное» конечно, но ещё сыровато. Как минимум подрезать образ с 2Gb до 1.5?, а то и 1Gb думаю вполне реально. А так же посмотреть что происходит с 1С при запуске, возможно долго инициализируется кэш, возможно нужно повыносить что-либо из контейнера на хост-систему, а то и в ram-disk

    Reply
  22. herfis

    Упс. Вопрос снимается. Сам дурак. Запуск происходит быстро, просто у меня окно авторизации почему-то открывается позади первого окна, а не поверх, и создается иллюзия продолжения запуска. Это к сборке не относится.

    Reply
  23. b00t

    (19) herfis, кстати, вполне возможно, я на своей dev-станции на core i5 с 16G памяти, SSD, а так же /tmp /var/cache в tmpfs на ram-диске просто не чувствую «проблему», надо будет запустить на машине по слабее.

    Reply
  24. b00t

    (22) herfis, бывает. с 1С вообще всякое бывает. но всё-равно есть что оптимизировать

    Reply
  25. herfis

    (24) Не вижу смысла в тонких оптимизациях и снижении размера образа. Два гига или один — абсолютно непринципиально. А скорость старта контейнера и сейчас высокая. Лучше потратить дорогое время специалиста на что-то более существенное и интересное с практической точки зрения 🙂

    Reply
  26. b00t

    (25) herfis, я в свое время создавал очень маленький docker контейнер с arch linux, очень много раз потом пригодился. Но 1С, сами понимаете — принципиально на ubuntu собрана, т.к. она настолько гвоздями к системе прибита, что сам контейнер и создавался, ради возможности запуска на других linux-ах. Ну да, проектов много, я вообще, признаться честно не 1С-ник, просто бывают разные проекты и работы. По поводу 1С есть ещё несколько смежных проектов по мере превращения чего-либо в более-менее интересный вид — может быть ещё опубликую что-нибудь необычное.

    Reply
  27. lustin

    (0) переименуйте репозиторий от греха подальше https://www.andreas-jung.com/contents/dont-use-docker-in-github-repo-names-or-as-twitter-handle

    Reply
  28. b00t

    (27) lustin, кстати, да! Я как-то читал это уже, но, представляете — вылетело из головы. Большое спасибо, что напомнили. Не люблю «копирастов», ведущих себя подобным образом, при этом они могут заюзать с десяток-другой технологий открытых, а потом — «А знаете, что вы имя наше не используйте и иконку уберите из репозитория», так ещё и помни о каждом. А не собрать ли мне этот контейнер чисто на LXC

    Reply
  29. herfis

    (27) lustin, ИМХО, подняли бурю в стакане воды. Очевидно, что это просто юристы перестраховались на случай реальной необходимости защиты торговой марки. Но осадочек оставляет, да.

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

    Reply
  30. alprk

    Здорово! Вот бы еще билд-скрипт сам умел качать нужный релиз с сайта.

    Reply
  31. b00t

    (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С — я, может быть, «психану» штуковиной, подобной описанному выше. Ну или кто-нибудь другой)

    Reply
  32. pumbaE

    (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 сервера утилита чудесная.

    Reply
  33. b00t

    (31) Infactum, а ещё очень правильно было бы использовать prelink в этом контейнере, причем настроив его руками под это дело, а то и подготовив prelink-образ ручками.

    Reply
  34. b00t

    (36) pumbaE, ну как бы смотрите — доступ на сайт ограничен (привет не только копирастам, но и 272 статье УК РФ).

    Доступ осуществляется на платной основе, по договору ИТС, в договоре по мимо всего прочего есть запрет на передачу своего логина пароля третьим лицам, но и запрета этого не нужно на самом деле.

    А на деле получается, что некто (возможно находясь в преступном сговоре) предоставил доступ к ресурсу, лицу, которое на такой доступ права не имело. В случае скрипта в репозитории — массово, т.е. вы предоставили доступ к платному ресурсу «неопределенному кругу лиц», читайте «публичный доступ». Тут даже в мире Linux не все гладко, вы думаете просто так ни один пакетный менеджер без дополнительных «хаков» не поставит в автоматическом режиме oracle-java-jdk или mscorefonts который, кстати zip-архивом у меня в репозитории лежит, хоть и с лицензией внутри, но я на самом деле должен у пользователя явно спросить, выкатив лицензию, типа подпишешь — продолжим, а не подпишешь — exit(0) отсюда! Любой юрист вам прояснит, что дело тут пахнет жареным, в плане дать кому-то логин пароль от users.v8.1c.ru, просто особо дела нет кому-то до этого, но внезапно всё может измениться, например, если ваш скрипт станет популярным или нужен будет показательный процесс-порка, ну или просто «нужный» дядя заскучает на работе. Одному знакомому была серьезно испорчена карьера в США, закончилось даже потерей работы и приездом назад в РФ в итоге. Безопасники случайно нарыли небольшую гору «компромата для копираста», чувак разработал эмуль какого-то ключа, от финансовой аналитической системы, причем чисто технически, сам не использовал, не продавал, просто лежали «исследовательские материалы» в репозитории, про который тот уже и забыл за давностью лет. Поэтому я не рекомендую столь халатно относиться к этому вопросу. И вообще — мир, дружба, opensource!

    Reply
  35. pumbaE

    (37) мені всеодно на «272 статье УК РФ».

    В скрипте есть возможность указать свои логин и пароль для доступа на итс.

    Reply
  36. Infactum

    (37) я вот не пойму что вы панику развели.

    Никто никакие пароли в общей доступ не выкладывает, как и дистрибутивы. Существующий скрипт просто позволяет вам скачать дистрибутивы нужно версий, если у вас есть на то права (доступ к сайту). Сами пароли нигде сохранены не будут, они исчезнут вместе с параметрами окружения, как только закроете сессию терминала.

    Вот если бы я сейчас стал собранный образ в публичный docker hub выкладывать — другой разговор.

    (32) (33) pumbaE, когда я говорил про локальный repo — речь не шла об использовании его на постоянной основе (хотя для внутренних задач компании может и пригодился бы). Речь о том, что вместо предварительной установки зависимости руками и далее dpkg -i клиента/сервера 1С в нужном порядке можно сделать примерно так:

    dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz \r
    mkdir -p /etc/apt/sources.list.d \r
    echo deb file:/tmp ./ > /etc/apt/sources.list.d/onec.list \r
    apt-get update \r
    apt-get -y —force-yes install 1c-enterprise83-client
    Reply
  37. b00t

    Никакой паники, я просто подумал, что используется какой-то определенный логин/пароль, а не спрашивается у пользователя.

    (39) Infactum, локальный репозиторий — очень удобно, да конечно в первую очередь для компании.

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

    Reply
  38. artbear

    Куда подевались 35 и 36 ?

    было что-то полезное? что за скрипт обсуждался?

    Reply
  39. Infactum

    (41) artbear, надо же, ссылку на мой гитхаб грохнули. Хотя ничего криминального там нет: альтернативная реализация сборщика docker образа, которая умеет сама качать дистрибутивы помимо прочего. Все легально (такой же функционал есть почти во всех конфигурациях для франчей), но похоже модераторам было лень разбираться.

    Reply
  40. b00t

    (42) Infactum, ну если там был просто скрипт сборки и при этом репозиторий не содержал: какого-либо логина/пароля для доступа или ссылки на место где их взять, готового образа вместе с 1С, ну или ссылки на него — то действительно непонятно, почему потёрли, ели же что-то из вышеперечисленного всё же есть в репозитории, даже если пользователю предлагается ввести свои логин и пароль — то это как раз та ситуация, о которой я и писал, убеждая всё же быть немного осторожнее.

    Reply
  41. Infactum

    (43) а вы стало быть так активно вели обсуждение, даже не заглянув туда? 100 строк кода изучить — много времени не надо.

    Тем не менее предлагаю спросить мнения людей, которые в отличие от модераторов могут прочитать Dockerfile и скрипт на баше. А то уже не первый раз такая ситуация с тем, что трут полезную информацию.

    artbeaer, pumbaE?

    Reply
  42. pumbaE

    (44) Infactum, я уже высказался лакам и star на github.

    Reply
  43. artbear

    (44) Я также отметился звездой на гитхабе.

    Репозиторий и скрипт абсолютно нормален.

    Пользователь вводит свой собственный логин/пароль и получает с сайте 1С только ту информацию, к которой у него лично есть доступ.

    никаких нарушений не вижу.

    Reply
  44. b00t

    (44) Infactum, я не ваш скрипт активно обсуждал, а способ распространения с предоставлением дистрибутива или доступа на сайт и возможные последствия. Если ваш скрипт не предоставляет ни первого, ни второго — то сказанное мной его не коим образом не касается. Я не успел изучить ваш скрипт до удаления ссылки на него,, у меня достаточно мало времени и много проектов, а на вопрос «чей логин и пароль использует скрипт?» может ответить и его автор, т.е. — вы. Если ваш скрипт спрашивает логин пароль у пользователя и качает дистрибутив с официального сайта — это правильный способ и удобный для пользователя. Я надеюсь я ничем вас не обидел, не упрекайте меня и не обижайтесь, я пишу очень много кода, на разных языках, мой «рабочий» день с 6 утра и до 2-3 ночи, мне действительно не всегда доступно лишнее время для изучения дополнительных 100 строчек кода. Как вас найти на гитхабе?

    Reply
  45. nicxxx

    а как этот ваш контейнер на windows запустить?

    Reply
  46. Infactum

    (48) Для запуска linux контейнеров на windows вам нужен либо docker for windows (если планируется совместно с hyper-v использовать), либо docker toolbox (если в связке с virtualbox). В любом случае это будет запуск в виртуалке.

    А еще нужны будут иксы, чтобы вывести окно приложения. Не знаю, что сейчас актуально, но можно взять XMing.

    Только зачем это все в таком виде под виндой надо — совершенно не ясно.

    Reply
  47. nicxxx

    (50) Вообще-то есть докер для windows. Я наверное неправильно вопрос задал, точнее будет так: «Какая должна быть строка параметров для запуска именно этого контейнера на windows?», потому что мэппинги линуксовых каталогов там, само-собой, не срабатывают и выдают ошибку.

    Очень мало хороших инструкций на русском по докеру, поэтому приходится тыкать вслепую…

    Reply
  48. maksaimer

    Как быть с програмными ключами? Как их пробросить в Докер контейнер? Как обычные файлы? При проверке лицензии 1с поймет что это та же машина и чек сумма по железу сойдётся?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *