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