Sphinxsearch в docker-контейнере
Mar 12, 2018 08:50 · 459 words · 3 minute read
В данной статье рассмотрим процесс сборки docker-образа включающего в себя систему полнотекстового поиска Sphinxsearch с возможностью переиндексации - давайте разберемся!
Несмотря на то, что в данный момент уже есть Sphinxsearch версии 3.0.1, в данном примере мы будем использовать стабильную и “обкатанную” версию поискового движка - 2.2.11.
За основу для нашего docker-образа возьмем ubuntu:16.04, и наш Dockerfile будет выглядеть следующим образом:
FROM ubuntu:16.04
ARG APP_ENV=dev
RUN apt-get update \
    && apt-get -y install \
        software-properties-common
RUN add-apt-repository ppa:builds/sphinxsearch-rel22 \
    && apt-get update \
    && apt-get -y install \
        mysql-client \
        unixodbc \
        libpq5 \
        sphinxsearch \
    && apt-get remove -y software-properties-common \
    && apt-get autoremove -y \
    && apt-get autoclean \
    && rm -r /var/lib/apt/lists/*
RUN ln -sf /dev/stdout /var/log/sphinxsearch/searchd.log \
    && ln -sf /dev/stderr /var/log/sphinxsearch/query.log
COPY start.sh /start.sh
COPY sphinx.conf.${APP_ENV} /etc/sphinxsearch/sphinx.conf
VOLUME ["/etc/sphinxsearch"]
VOLUME ["/var/lib/sphinxsearch/data"]
EXPOSE 9312 9306
CMD ["/start.sh"]
В зависимости от переданного при сборке docker-образа значения аргумента APP_ENV (по умолчанию это dev), в образ будет скопирован соответствующий конфигурационный файл sphinx.conf.${APP_ENV}.
При старте docker-контейнера будет выполнен bash-скрипт start.sh, который выполняет переиндексацию и запуск поискового движка. Содержимое скрипта довольно простое:
#!/usr/bin/env bash
indexer --config /etc/sphinxsearch/sphinx.conf  --rotate --all
searchd --config /etc/sphinxsearch/sphinx.conf --nodetach
Пример конфигурационного файла sphinx.conf:
source parent_source
{
    type			= mysql
    sql_host			= db1.lc
    sql_user			= testuser
    sql_pass			= password
    sql_db		    	= test
    sql_port			= 3306
    mysql_connect_flags		= 32 # enable compression
    sql_query_pre		= SET NAMES utf8
    sql_query_pre       	= SET CHARACTER SET utf8
}
source src_blog_posts:parent_source
{
    sql_query = \
        SELECT blog_post_id as id, title, content, tags \
        FROM blog_posts \
        WHERE visible = 1 \
        AND dt_published <= NOW()
    sql_ranged_throttle = 0
    sql_field_string = title
    sql_field_string = content
    sql_field_string = tags
}
index blog_posts
{
    source = src_blog_posts
    path = /var/lib/sphinxsearch/data/blog_posts
    docinfo = extern
    mlock = 0
    morphology = stem_enru
    index_exact_words = 1
    charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
    min_word_len = 1
    min_infix_len = 1
    html_strip = 1
}
indexer
{
    mem_limit = 256M
}
searchd
{
    listen			= 9312
    listen			= 9306:mysql41
    log 			= /var/log/sphinxsearch/searchd.log
    query_log			= /var/log/sphinxsearch/query.log
    read_timeout		= 5
    client_timeout		= 300
    max_children		= 30
    pid_file			= /var/run/sphinxsearch/searchd.pid
    seamless_rotate		= 1
    preopen_indexes		= 1
    unlink_old			= 1
    workers			= threads
    binlog_path			= /var/lib/sphinxsearch/data
    collation_server		= utf8_general_ci
    watchdog			= 1
}
Собираем docker-образ находясь в каталоге с Dockerfile с помощью следующей команды:
docker build -t sphinx:latest .
Запустить docker-контейнер из созданного нами образа можно так:
docker run -d \
	--name sphinxsearch \
	-v $(pwd)/sphinx.conf:/etc/sphinxsearch/sphinx.conf \
	-v $(pwd)/sphinxdata:/var/lib/sphinxsearch/data \
sphinx:latest
Или с помощью docker-compose.yml (для удобства редактирования конфиг sphinx монтируем с хост-машины в docker-контейнер):
...
### Sphinxsearch Container ##################################
  sphinxsearch:
    container_name: sphinxsearch
    image: sphinx:latest
    volumes:
      - ./sphinx/sphinx.conf:/etc/sphinxsearch/sphinx.conf
      - sphinx:/var/lib/sphinxsearch/data
...
### Volumes Setup ###########################################
volumes:
  sphinx:
    driver: "local"
При необходимости можно запустить переиндексацию с помощью команды:
docker exec -it sphinxsearch indexer --config /etc/sphinxsearch/sphinx.conf  --rotate --all