Докер и блокировка файлов - PullRequest
3 голосов
/ 26 марта 2019

Я написал простое приложение go и добавил систему flock, чтобы предотвратить одновременный запуск дважды:

import "github.com/nightlyone/lockfile"

lock, err := lockfile.New(filepath.Join(os.TempDir(), "pagerduty-read-api.lock"))
if err != nil {
    panic(err)
}

if err = lock.TryLock(); err != nil {
    fmt.Println("Already running.")
    return
}

defer lock.Unlock()

Хорошо работает на моем хосте. В докере я попытался запустить его с разделением томов tmp:

docker run --rm -it -v /tmp:/tmp my-go-binary

Но это не работает. Я полагаю, это потому, что система flock не портирована на разделение томов.

Мой вопрос: есть ли в Docker возможность работать с flock между запущенными экземплярами? Если нет, то каковы мои другие варианты такого же поведения?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

Этим утром я написал небольшую тестовую программу Python, которая просто записывает в файл миллион последовательных целых чисел с блокировкой flock (), получая и снимая блокировку один раз для каждого добавленного числа. Я запустил 5 контейнеров, каждый из которых запускал эту тестовую программу, и каждый записывал один и тот же файл на томе докера.

С включенной блокировкой все числа были записаны без взаимного влияния, и в файле было ровно 5 миллионов целых чисел. Они не были последовательными, когда написаны таким образом, но это ожидается и согласуется с работой flock ().

Без блокировки многие из чисел были записаны таким образом, что это указывает на то, что числа шли вразрез с блокировкой многозадачности без блокировки. В файле было только 3 167 546 номеров и 13 357 пустых строк. Это составляет в общей сложности 3 180 903 строки в файле, что существенно отличается от требуемых 5 000 000.

Хотя программа не может окончательно доказать, что никогда не возникнет проблем, просто много раз тестируя, для меня это довольно убедительный аргумент, что Linux flock () работает через контейнеры.

Кроме того, просто имеет смысл, что flock будет работать через контейнеры; контейнеры - это всего лишь общее ядро, отдельный pid, отдельный файл (кроме томов) и отдельное пространство IP-порта.

Я провел свой тест на системе Linux Mint 19.1 с ядром Linux 4.15.0-20-generic, Docker 19.03.0 - сборка aeac949 и CPython 3.6.8.

Go - классный язык, но почему flock () не работает на томах в вашей программе Go, я не знаю.

НТН.

0 голосов
/ 26 марта 2019

Я предполагаю, что вы хотите использовать том докера или вам могут потребоваться некоторые другие плагины тома https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins.

Согласно этой статье, разрешение файла тома Docker и блокировка https://forums.docker.com/t/docker-volume-file-permission-and-locking/24335 тома докера предоставляет толькоспособ определения тома для использования несколькими контейнерами или для использования контейнером после перезапуска.

В плагинах томов Docker Flocker может удовлетворить ваши требования.Flocker - это менеджер томов данных с открытым исходным кодом для ваших приложений Dockerized.https://github.com/ScatterHQ/flocker

Кстати, если вы используете kubernetes, вам может потребоваться больше узнать о постоянном томе, утверждении о постоянном томе, классе хранения.

...