Здравствуйте, есть ли способ использовать команды оболочки в файле 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"
Привет @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}" )
Как пользоваться:
ИЛИ ЖЕ
Предостережения:
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-
Вы получаете это, потому что подписаны на эту ветку.
Ответьте на это письмо напрямую, просмотрите его на 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
Самый полезный комментарий
Было бы очень полезно иметь ....