Compose: Использование команды оболочки в docker-compose.yml

Созданный на 27 окт. 2016  ·  41Комментарии  ·  Источник: docker/compose

Здравствуйте, есть ли способ использовать команды оболочки в файле docker-compose.yml ?
Вот мой вариант использования:

 version: '2'
 services:
   ci:
     image: jenkins
     volumes:
       - ./data:/var/jenkins_home
       - /var/run/docker.sock:/var/run/docker.sock
       - $(command -v docker):/usr/bin/docker
     groupadd:
       - $(stat -c %g /var/run/docker.sock)
     ports:
       - "8080:8080"
       - "50000:50000"

В настоящее время он дает мне эту ошибку:

ERROR: Invalid interpolation format for "volumes" option in service "ci": "${command -v docker}:/usr/bin/docker"
kinquestion

Самый полезный комментарий

Было бы очень полезно иметь ....

Все 41 Комментарий

Привет @zkanda!

Извините, это не то, что мы поддерживаем. Обычно это делается путем установки переменных среды и использования вместо них подстановки переменных внутри файла Compose.

@ shin- спасибо, я могу обойтись с переменными окружения. Также .env кажется очень полезным.
Соответствующие документы: https://docs.docker.com/compose/environment-variables/#/the -env-file

@zkanda , вы когда-нибудь заставляли это работать, я пробовал в своем файле .env

DOCKER_BIN=`which docker`

а затем в docker-compose.yml

jenkinsmaster:
  build: jenkins-master
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ${DOCKER_BIN}:/usr/bin/docker
  ports:
    - "50000:50000"

Но я продолжаю получать

Cannot create container for service jenkinsmaster: create `which docker`: "`which docker`" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.

Получается, что команды интерпретируются как строки в файле .env ?

Команды не раскрываются в Compose, в .env или где-либо еще.

Было бы очень полезно иметь ....

+1

Вот пример использования. При настройке Kafka ему нужен IP-адрес хост-машины. У меня есть следующий сценарий, чтобы получить это для меня:

DOCKER_HOST_IP=$(ifconfig | grep 'inet .*br' | sed -E 's/.*inet (.*) netmask.*/\1/')

Я ссылаюсь на этот IP-адрес в env. Я больше не могу просто запускать docker-compose up , потому что мне нужно запустить это заранее. И мне нужно сообщить об этом другим разработчикам в команде.

+1

Было бы полезно получить текущего пользователя, например:

services:
  foo:
    image: bar:latest
    user: ${CURRENT_USER-$(id -u):$(id -g)}

Должны быть и другие варианты использования ...

Кстати, я не понимаю, что ${BAZ-default} работает в Compose, если мы не можем выполнить остальные функции Bash ... (насколько мне известно, - - одна из функций Bash для работы с переменными, например, в качестве замены на ${VAR/search/replace} )

Да @ davi5e ... То, что я пытался:

version: "3.7"

services:
  orchestrator:
    build: .
    ports:
      - "2000:2000"
    # Use type host until we can test link
    network_mode: "host"
    environment:
      - NODE_ENV=development
      - LOCAL_USER_ID=${id -u}

@ davi5e Другой

+1
Пожалуйста, откройте проблему повторно

+1
мой вариант использования - это публикация диапазона портов, который определяется как функция «базового» порта

Это было бы очень полезно для установки переменных UID / GID, поскольку это в значительной степени является требованием для использования Docker в среде разработки (без необходимости использовать сценарии для установки этого в файл .env).

+1

Можно использовать это, чтобы пометить / пометить изображения, созданные docker compose, с помощью тега git и фиксации хеша:

В .env :

GIT_VERSION=$(git describe --always --dirty --abbrev)
OUTER_PORT=6970

В docer-complse.yml :

version: '3'
services:
  nginx:
    restart: always
    build:
        context: ./nginx
        labels:
          org.label-schema.schema-version: "1.0"
          org.label-schema.version: "${GIT_VERSION}"
          org.lavel.schema.url: "https://mydocu-server.company.com/vcs/${GIT_VERSION}"
    ports:
      - ${OUTER_PORT}:8080

Для тех, кто делает это в процессе разработки, если ваша оболочка устанавливает переменную UID , вы можете передать ее при создании локального образа разработки. Поскольку локальный образ разработки не является общедоступным, вам не нужно беспокоиться о конфликтах uid с коллегами.

+1

@ con-f-use. Действие, которое просто отправляет фактическую команду, а не результат моего тестирования, единственный хак, который мне удалось до сих пор, - это написание сценария, обертывающего docker compose, который устанавливает переменную среды.

+1

TL; DR, если вы хотите экспортировать эти переменные из файла .env :

# set the path of .env file here
ENV_FILE="${ENV_FILE:-local.env}"
while IFS= read -r line; do
  export "$line"
done < <( grep --color=never -E -v -e '^#' -e '^[[:space:]]*$' "${ENV_FILE}" )

Как пользоваться:

  • Введите его в командной строке и нажмите клавишу ВВОД, чтобы изменить текущую среду оболочки.

ИЛИ ЖЕ

  • Сохраните его как сценарий bash и создайте его

Предостережения:

  • Сохранение этого сценария и его запуск не приведет к волшебному экспорту этих переменных в текущую среду оболочки. Вам нужно будет найти его или сделать какую-нибудь причудливую eval .
  • (Может быть, это хорошо?) Он перезапишет существующие переменные с тем же именем в $ENV_FILE

Пояснение: здесь

Взгляните на direnv, чтобы автоматизировать все это https://direnv.net/

В пятницу, 28 июня 2019 г., 12:57 Sudarshan Wadkar [email protected]
написал:

TL; DR, если вы хотите экспортировать эти переменные из файла .env:

укажите здесь путь к файлу .env

ENV_FILE = "$ {ENV_ FILE: -local.env }", а IFS = чтение -r строка; делать
экспорт "$ line" выполнено <<(grep --color = never -E -v -e '^ #' -e '^ [[: space:]] * $' "$ {ENV_FILE}")

Как пользоваться:

  • Введите его в командной строке
  • Сохраните его как сценарий bash и создайте его

Предостережения:

  • Сохранение этого как скрипта и запуск не приведет к волшебному экспорту этих
    переменные в вашей текущей среде оболочки. Вам нужно будет найти это или сделать
    какой-то модный eval.
  • (Может быть, это хорошо?) Он перезапишет существующие переменные такими же
    имя в $ ENV_FILE

Пояснение: здесь
https://explainshell.com/explain?cmd= while+IFS%3D+read+-r+line%3B+do+export+%22%24line%22%3B+done+%3C+%3C%28grep+--color%3Dno+ -v + -e +% 27% 5E% 23% 27 + -e +% 27% 5E% 5B% 5B% 3Aspace% 3A% 5D% 5D *% 24% 27 +% 24% 7BENV_FILE% 7D% 29

-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDBQXQZTC5FXTOFL6UTP4XOBJA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG63LNMVBOD5TUL52HS4DFVREXG63LJMVBOD5
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACHRDGJ6FAQBEDLBSRVS6TP4XOBJANCNFSM4CUISSSA
.

Да, direnv - это хорошо, но я не уверен, будет ли он полезен с файлом .env Docker, в котором есть простые строки с простым синтаксисом VAR=VAL (согласно этой ссылке). идея, что .env файл фиксируется в репозитории, и сценарий сборки может запускать его на моем локальном компьютере или docker-compose может запускать его на стадии подготовки / развертывания.

На самом деле нет переменных среды
https://en.wikipedia.org/wiki/Environment_variable, если они являются частью
кодовая база, а не часть среды ...

Пт, 28 июня 2019 г., 14:04 Сударшан Вадкар [email protected]
написал:

Да, direnv хорош, но я не уверен, будет ли он полезен с Docker
.env файл, который содержит простые строки с простым синтаксисом VAR = VAL (согласно этому
https://docs.docker.com/compose/env-file/#syntax-rules ссылка.) Идея
файл .env фиксируется в репозитории, и сценарий сборки может
запустить его на моем локальном компьютере или docker-compose можно запустить на этапе подготовки / развертывания.

-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/docker/compose/issues/4081?email_source=notifications&email_token=AACHRDCEKOMK2VI3A43QBC3P4XV5BA5CNFSM4CUISSSKYY3PNVWWK3TUL52HS4DFVREXG43LNMVBW40MVBW40YX4DFVREXG43LBMVBW40
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACHRDF3Q3YOZPHUIUZYEPTP4XV5BANCNFSM4CUISSSA
.

Ох, ну ладно.

Мне нравится думать, что файл .env превращается в переменную среды, когда вы выполняете docker-compose up .

Моим вариантом использования было использование того же файла .env в качестве источника истины для запуска локального экземпляра разработчика (возможно, без помощи docker-compose ). Так что да, возможно, эти строки в файле .env самом деле не являются переменными среды, но они обязательно превращаются в одну при развертывании.

Я до сих пор не понимаю, как direnv поможет в этом случае.

Другой вариант использования - поместить в контейнер команду, которая генерирует пароль, назначающий его env var.
Таким образом, пароль фактически не будет записан в файлах .env или docker-compose.yml.

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

+1

+1

+1, было бы очень полезно для установки uid и gid без чрезмерного усложнения решения

``
/ _ / \
(оо)

^ <`` `

+1 У меня есть вариант использования, упомянутый выше, для добавления ветки git и фиксации в файле compose, который в конечном итоге войдет в файл docker, а затем будет добавлен как версия в манифесте jar, созданного на этапе многоступенчатого процесса сборки докера .

  gateway:
    image: name
    build:
      context: ./project
      dockerfile: build/Dockerfile
      args:
        - GIT_COMMIT=${$(git rev-list -1 HEAD):-unspecified}
        - GIT_DATE=${$(git log -1 --date=short --pretty=format:%ct):-unspecified}

Итак, в настоящее время для 7 проектов в моем файле компоновки я должен установить среду 7x2. Грустный.

@ shin- Не могли бы вы повторно открыть это как запрос функции? Похоже, что это не было решено хорошими обходными путями, и в этом есть серьезная потребность.

+1 Наверное, можно было бы добиться этого другим способом, но мне нужно было задействовать движок докера из контейнера, чтобы перезагрузить соседний контейнер. В случае, если срок действия моего сертификата Letsencrypt истек, но мне нужно перезапустить контейнер NGinx после обновления. Проблема в том, как мне сообщить docker-compose внутри контейнера, каково имя проекта для этой группы контейнеров? PROJECT=(basedir ~+) . На данный момент он закодирован вручную :(

+1 к этому запросу функции
Другой вариант использования - это захват секретов из cli / http (например, хранилище, 1Password) и подключение к среде.
т.е.

...
    environment:
      - SERVICE_USERNAME=$(vault kv get -field=username kv/service/credentials)
      - SERVICE_PASSWORD=$(vault kv get -field=password kv/service/credentials)
...

У меня те же потребности, что и у @rafaelbattesti , за исключением того, что я использую lastpass.

...
     environment:
         - TRPASSWD=$(lpass show --password Transmission)
....

+1

+1

@ shin- Не могли бы вы повторно открыть это как запрос функции? Похоже, что это не было решено хорошими обходными путями, и в этом есть серьезная потребность.

@ four43 , может быть, @ shin- или другие не читают комментарии по закрытым вопросам? Может, откроем еще один, чтобы привлечь внимание?

Расширение переменных в файле docker-compose было бы очень полезной функцией ...

+1

@esale - Да, думаю, это отчасти зависит. Я видел, что это выходит за рамки этого дела. Не переусердствуйте с некоторыми DSL. На этом этапе шаблон файла docker-compose с помощью какого-либо другого инструмента? Мы слишком много пересекаем опасения?

Если вы используете файл .env, вы можете заменить вывод оболочки такой командой

eval "echo \"$(cat .env.example)\"" > .env

Пример файла .env.example

DOCKER_BIN=$(which docker)
DOCKER_COMPOSE_BIN=$(which docker-compose)

Создайте файл .env

DOCKER_BIN=/snap/bin/docker
DOCKER_COMPOSE_BIN=/snap/bin/docker-compose
Была ли эта страница полезной?
0 / 5 - 0 рейтинги