В этой статье я хочу рассказать про то как можно получить свой образ Docker с InterSystems Caché/Ensemble.
Начнем с самого начала, т.е. с Dockerfile. Dockerfile это простой текстовый файл в формате yml с инструкциями по сборке образа.
Я рекомендую использовать в качестве базового образа CentOS, так как InterSystems официально поддерживает RedHat в качестве основной платформы, и CentOS в качестве платформы для разработки.
FROM centos:6
Вы можете добавить себя в качестве автора файла.
MAINTAINER Dmitry Maslennikov <mrdaimor@gmail.com>
Первым шагом, нужно установить некоторые утилиты которые понадобятся как в процессе установки, так и для работы Caché. Здесь я еще настроил часовой пояс.
# update OS + dependencies & run Caché silent instal
RUN yum -y update
&& yum -y install which tar hostname net-tools wget
&& yum -y clean all
&& ln -sf /etc/locatime /usr/share/zoneinfo/Europe/Moscow
Определим временную папку, для дистрибутива.
ENV TMP_INSTALL_DIR=/tmp/distrib
Определим некоторые аргументы со значениями по умолчанию, которые потом можно будет изменять при сборке.
ARG password="Qwerty@12"
ARG cache=ensemble-2016.2.1.803.0
Теперь нужно определить параметры для автоматической установки.
ENV ISC_PACKAGE_INSTANCENAME="ENSEMBLE"
ISC_PACKAGE_INSTALLDIR="/opt/ensemble/"
ISC_PACKAGE_UNICODE="Y"
ISC_PACKAGE_CLIENT_COMPONENTS=""
ISC_PACKAGE_INITIAL_SECURITY="Normal"
ISC_PACKAGE_USER_PASSWORD=${password}
Я решил установить безопасность Caché на уровень Normal, и поэтому нужно установить пароль.
В документации можно найти больше вариантов настроек.
В качестве рабочей директории пока установим временную папку для дистрибутива, данной директивой папка будет создана если ранее не существовала.
WORKDIR ${TMP_INSTALL_DIR}
Вы можете сразу добавить файл лицензии, если не собираетесь выкладывать образ в публичные репозитории.
COPY cache.key $ISC_PACKAGE_INSTALLDIR/mgr/
Теперь нам нужен дистрибутив для сборки, и есть несколько способов получить его:
- Загрузить дистрибутив вручную, и положить его рядом с файлом Dockerfile, добавить его такой командой, которая сразу и распакует его по указанному пути.
ADD $cache-lnxrhx64.tar.gz .
- Загрузить напрямую с WRC.
RUN wget -qO /dev/null --keep-session-cookies --save-cookies /dev/stdout --post-data="UserName=$WRC_USERNAME&Password=$WRC_PASSWORD" 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp' | wget -O - --load-cookies /dev/stdin "https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/$cache-lnxrhx64.tar.gz" | tar xvfzC - .
В таком случае нужно указать логин и пароль от WRC, чтобы получить доступ к дистрибутиву, и нужно добавить к списку аргументов еще два.
ARG WRC_USERNAME=”username” ARG WRC_PASSWORD=”password”
Нужно помнить, что любое упомниание паролей в Dockerfile небезопасно, потому что их потом можно вытащить. Так что это не самый безопасный способ.
- И предпочтительный способ, это хранить дистрибутивы на внутреннем сервере компании, и загружать его оттуда с анонимным доступом.
RUN wget -O - "ftp://ftp.company.com/cache/$cache-lnxrhx64.tar.gz" | tar xvfzC - .
Все готово к установке, можно запускать.
RUN ./$cache-lnxrhx64/cinstall_silent
После завершения установки, нужно остановить сервер.
RUN ccontrol stop $ISC_PACKAGE_INSTANCENAME quietly
Но это не все, в Docker для работы контейнера нужен один процесс контролирущий процесс. И для этого нам понадобится проект ccontainermain от Luca Ravazzolo. Загрузим бинарник напряму с гитхаба.
# Caché container main process PID 1 (https://github.com/zrml/ccontainermain)
RUN curl -L https://github.com/zrml/ccontainermain/raw/master/distrib/linux/ccontainermain -o /ccontainermain
&& chmod +x /ccontainermain
Чистим временную папку.
RUN rm -rf $TMP_INSTALL_DIR
# Workaround for an overlayfs bug which prevents Cache from starting with <PROTECT> errors
COPY ccontrol-wrapper.sh /usr/bin/
RUN cd /usr/bin
&& rm ccontrol
&& mv ccontrol-wrapper.sh ccontrol
&& chmod 555 ccontrol
Код обертки ccontrol-wrapper.sh.
#!/bin/bash
# Work around a weird overlayfs bug where files don't open properly if they haven't been
# touched first - see the yum-ovl plugin for a similar workaround
if [ "${1,,}" == "start" ]; then
find $ISC_PACKAGE_INSTALLDIR -name CACHE.DAT -exec touch {} ;
fi
/usr/local/etc/cachesys/ccontrol $@
Проверить какой драйвер используется в Docker можно такой командой.
docker info --format '{{.Driver}}'
Нужно сообщить Docker какие сетевые порты используются в контейнере, это 57772 для Web доступа и 1972 для бинарного доступа, стандартные порты по умолчанию в Caché.
EXPOSE 57772 1972
И наконец сообщим как запускать контейнер.
ENTRYPOINT ["/ccontainermain", "-cconsole", "-i", "ensemble"]
В итоге файл приобретает такой вид:
FROM centos:6
MAINTAINER Dmitry Maslennikov <Dmitry.Maslennikov@csystem.cz>
# update OS + dependencies & run Caché silent instal
RUN yum -y update
&& yum -y install which tar hostname net-tools wget
&& yum -y clean all
&& ln -sf /etc/locatime /usr/share/zoneinfo/Europe/Prague
ARG password="Qwerty@12"
ARG cache=ensemble-2016.2.1.803.0
ENV TMP_INSTALL_DIR=/tmp/distrib
# vars for Caché silent install
ENV ISC_PACKAGE_INSTANCENAME="ENSEMBLE"
ISC_PACKAGE_INSTALLDIR="/opt/ensemble/"
ISC_PACKAGE_UNICODE="Y"
ISC_PACKAGE_CLIENT_COMPONENTS=""
ISC_PACKAGE_INITIAL_SECURITY="Normal"
ISC_PACKAGE_USER_PASSWORD=${password}
# set-up and install Caché from distrib_tmp dir
WORKDIR ${TMP_INSTALL_DIR}
ADD $cache-lnxrhx64.tar.gz .
# cache distributive
RUN ./$cache-lnxrhx64/cinstall_silent
&& ccontrol stop $ISC_PACKAGE_INSTANCENAME quietly
# Caché container main process PID 1 (https://github.com/zrml/ccontainermain)
&& curl -L https://github.com/daimor/ccontainermain/raw/master/distrib/linux/ccontainermain -o /ccontainermain
&& chmod +x /ccontainermain
&& rm -rf $TMP_INSTALL_DIR
WORKDIR ${ISC_PACKAGE_INSTALLDIR}
# TCP sockets that can be accessed if user wants to (see 'docker run -p' flag)
EXPOSE 57772 1972
ENTRYPOINT ["/ccontainermain", "-cconsole", "-i", "ensemble"]
Теперь мы готовы собрать образ. Нужно выполнить такую команду в папке где лежит Dockerfile.
docker build -t ensemble-simple .
В процессе сборки будет загружен исходный образ, и сам процесс установки Caché.
Поменять значения параметров для сборки можно так.
docker build --build-arg password=SuperSecretPassword -t ensemble-simple .
docker build --build-arg cache=ensemble-2016.2.1.803.1 -t ensemble-simple .
И можно запустить новый образ такой командой.
docker run -d -p 57779:57772 -p 1979:1972 ensemble-simple
Здесь 57779 и 1979, это порты по которым контейнер будет доступен с локальной машины.
Такой командой можно увидеть, все запущенные контейнеры.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f8d2cb3745a ensemble-simple "/ccontainermain -..." 18 seconds ago Up 17 seconds 0.0.0.0:1979->1972/tcp, 0.0.0.0:57779->57772/tcp keen_carson
Теперь можно открывать портал управления по ссылке http://localhost:57779/csp/sys/UtilHome.csp. Наша новая система работает и доступна.
Исходники можно найти на гитхабе здесь.
Автор: InterSystems