Docker-compose, условный оператор (например, добавление объема только при условии) - PullRequest
0 голосов
/ 17 мая 2018

Я хочу добавить том к своему сервису, но только если конечный пользователь дал папку для него.В противном случае не нужно подключать том, поскольку в уже подготовленном образе есть допустимые данные в папке по умолчанию.

То есть я хочу сделать что-то вроде;псевдокод:

services:

  my_awesome_service:

    volumes:
      if ${VARIABLE} => ${VARIABLE}:/app/folder

Является ли создание такого условного оператора выполнимым и определяемым в файле docker-compose? Единственный способ сделать это возможным - сначала определить базовый docker-файл compose, который не имеет монтирования тома, и вызов второго файла docker-compose, только если определено $VARIABLE.Это хорошо для одного или нескольких условий, но становится неприятным, если их много.

Любое решение?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Ничего подобного в настоящее время не существует. Варианты реализации этого, которые я могу придумать, включают:

  1. Создайте множество составных частей файла и объедините части, необходимые для создания окончательного файла.

  2. Динамически генерируйте ваш файл композиции. Что-то вроде jsonnet может быть хорошей отправной точкой.

  3. Пропустите создание и просто динамически сгенерируйте команду docker run. Это начинает испытывать недостаток в переносимости, но некоторые варианты использования просто легче написать самостоятельно.

  4. Отправьте PR в репозитории compose и docker / cli github, чтобы расширить функциональность compose. Выполнение этого с использованием синтаксиса шаблона golang было бы для меня наиболее логичным.

0 голосов
/ 26 сентября 2018

Если вы используете Rancher для оркестровки, доступны экранированные значения {{...}}}, которые можно использовать для условных операторов в версии docker-compose Ранчера.

Подробнее об интегрированной системе шаблонов GO здесь .

0 голосов
/ 17 мая 2018

Да, я не думаю, что формат docker-compose поддерживает условные операторы.

Однако, два решения могут быть:

  1. Передайте "сложную" (подобную списку) переменную в docker-compose, например, в этом примере :

докер-compose.yaml:

command: ${COMMAND_PARAMS}

Баш:

#!/bin/bash
if test -z $CONDITION; then
  params="-param1 ${MIPARAM1}"
else
  params="-param1 ${MIPARAM1} -param2 ${MIPARAM2}"
fi
COMMAND_PARAMS=$params docker-compose up

(кредиты идут на оригинальный постер на github, @shin -)

  1. Подготовьте папку по умолчанию в образе докера в папке с именем, подобным folder_defaults, затем всегда определите том в docker-compose.yml, но, наконец, в образе докера есть внутренний скрипт, который проверяет, является ли папка тома пуста, а если так, то ln -s до folder_defaults; в противном случае оставьте все как есть.

Пример условного скрипта:

if [ -z "$(ls -A /a/folder)" ]; then
  do something... using /a/folder_defaults
fi
...