Ошибки блокировок памяти, которые вы видите в Elasticsearch, являются распространенной проблемой, которая характерна не только для использования Docker, но возникает, когда Elasticsearch получает запрос на блокировку своей памяти, но не может этого сделать.Вы можете обойти ошибку, удалив следующую переменную среды из файла docker-compose.yml
:
- bootstrap.memory_lock=true
Memlock может использоваться в Docker Swarm Mode, но снекоторые предостережения.
Не все опции, которые работают с docker-compose
(Docker Compose), работают с docker stack deploy
(Docker Swarm Mode) и наоборот, несмотря на то, что оба разделяют синтаксис YAML docker-compose.Одним из таких вариантов является ulimits:
, который при использовании с развертыванием стека докеров будет игнорироваться с предупреждением, например так:
Ignoring unsupported options: ulimits
Я предполагаю, что с вашим файлом docker-compose.yml
Elasticsearch работает нормальнос docker-compose up
, но не с docker stack deploy
.
В режиме Docker Swarm Mode по умолчанию определенный вами экземпляр Elasticsearch будет иметь проблемы с memlock.В настоящее время настройка ulimits для сервисов Docker Swarm пока официально не поддерживается .Однако есть способы обойти эту проблему.
Если хостом является Ubuntu , неограниченная блокировка памяти может быть включена через службу докера (см. здесь и здесь ).Это может быть достигнуто с помощью команд:
echo -e "[Service]\nLimitMEMLOCK=infinity" | SYSTEMD_EDITOR=tee systemctl edit docker.service
systemctl daemon-reload
systemctl restart docker
Однако установка memlock на бесконечность не лишена недостатков, как указано самими Elastic здесь .
Basedна моем тестировании решение работает на Docker 18.06, но не на 18.09.Учитывая несогласованность и возможность запуска Elasticsearch, лучшим вариантом будет , а не использование memlock с Elasticsearch при развертывании на Swarm.Вместо этого вы можете выбрать любой из других методов, упомянутых в Elasticsearch Docs , для достижения аналогичных результатов.