В моем docker-compose у меня есть command
вот так:
version: "3.9"
...
command: "/bin/sh -c 'max=20; min=10; trap exit TERM; while :; do echo test; sleep $(($RANDOM%($max-$min+1)+$min)); done"
...
Он печатает test
с интервалом от 10 до 20 секунд. В моем терминале это работает нормально. В docker-compose есть проблемы:
WARN[0000] The "RANDOM" variable is not set. Defaulting to a blank string.
WARN[0000] The "max" variable is not set. Defaulting to a blank string.
WARN[0000] The "min" variable is not set. Defaulting to a blank string.
WARN[0000] The "min" variable is not set. Defaulting to a blank string.
WARN[0000] /..../dist/docker-compose.yml: `version` is obsolete
1 error(s) decoding:
* error decoding 'services[tool].command': invalid command line string
Кажется, есть проблемы с этими переменными bash. Есть ли способ это исправить?
Есть ли способ это исправить?
Из https://docs.docker.com/compose/compose-file/12-interpolation/:
Вы можете использовать $$ (знак двойного доллара), если в вашей конфигурации требуется буквальный знак доллара. Это также не позволяет Compose интерполировать значение, поэтому $$ позволяет вам ссылаться на переменные среды, которые вы не хотите обрабатывать Compose.
Также нет необходимости использовать $
внутри $((
арифметического расширения, даже это вредно, поскольку может привести к двойному расширению. Действительно просто:
sleep $((RANDOM % (max - min + 1) + min));
Создайте сценарий точки входа entrypoint.sh
и укажите его в своем docker-compose.yml
. Этот подход чище и отделяет вашу логику от docker-compose.yml
, что упрощает обслуживание и отладку.
#!/bin/sh
max=20
min=10
trap exit TERM
while :; do
echo test
sleep $(($RANDOM % ($max - $min + 1) + $min))
done
Обязательно сделайте этот скрипт исполняемым:
chmod +x entrypoint.sh
Ссылка на сценарий в вашем docker-compose.yml
version: "3.9"
services:
lool:
image: image_name
entrypoint: ["/bin/sh", "-c", "/path/to/entrypoint.sh"]