2016-05-12 2 views
2

Пусть на моем докер клиентской машине у меня есть следующие переменные окружения:Как фильтровать переменные среды клиента докеров в команду запуска docker?

myValA=B 
DOCKER_CONTAINER_VALUE_C=networksettingD 
myValE=F 
DOCKER_CONTAINER_VALUE_G=arbitrarySettingH 

и я хочу передать два из этих значений в мой Докер контейнер я бегу. (Те, которые содержат DOCKER_CONTAINER).

Теперь я мог вручную жёстко его, как это:

docker run -e DOCKER_CONTAINER_VALUE_C='networksettingD' -e DOCKER_CONTAINER_VALUE_G='arbitrarySettingH' --name container_name dockerhub_id/image_name 

Но я хочу, чтобы автоматизировать этот процесс.

Что-то вроде:

docker run -e ${env | grep "DOCKER_CONTAINER"} ... 

Мой вопрос: Как фильтровать переменные окружения клиента докер в команду докер выполнения?

ответ

1

Вы могли бы сделать что-то вроде этого:

set | grep DOCKER_CONTAINER > env_file 
docker run --env-file env_file ... 

Или, если вы действительно хотите одной командной строки:

docker run --env-file <(set | grep DOCKER_CONTAINER) ... 

<(...) конструкт Баш синтаксис для подстановки процессов. От bash(1):

Подстановка процессов поддерживается на системах, которые поддерживают именованные каналы (FIFO) или метод /DEV/Fd именования открытых файлов. Он принимает форму < (список) или> (список). Список процессов запускается со своим вводом или выводом, подключенным к FIFO или некоторому файлу в /dev/fd. Имя этого файла передается в качестве аргумента текущей команде в качестве результата расширения .

0
env | { sed -n '/DOCKER/s/^/-e /p' ; echo myimage; } | xargs docker run 
+1

Это действительно не сработает. Если ваша заключительная команда - «xargs docker запустите myimage», результатом от xargs будет «docker run myimage -e ...», который не будет делать то, что вы хотите.Кроме того, переменные, содержащие пробелы, будут в любом случае зависеть от этого, и если бы вы надеялись провести интерактивную сессию докеров, вам было бы не повезло. – larsks

+0

@larsks Спасибо за отзыв. На самом деле я не использую докер, но я внесла свой ответ, чтобы объяснить, что дальнейшие аргументы могут следовать за опциями -e. –

+0

Это все равно не будет выполнено, потому что 'xargs' передает' -e DOCKER_CONTAINER_VALUE_C = networksettingD -e DOCKER_CONTAINER_VALUE_G = произвольныйSettingH' как один аргумент, что приводит к ошибке. – larsks

0

Что-то простое, как:

docker run -e $(set | echo $(sed -n "/^DOC.*_CON.*_VAL.*/s/^/-e /p")" ")--name container_name dockerhub_id/image_name 
  • $() - команда запуска
  • набор - список переменных окружения
  • SED -n - не делают никакой печати
  • строка соответствия^DOC. _CON. . _VAL *
  • заменить «-e» для начала строки символа
  • р - печать соответствует
  • «» - добавить пространство между результатами

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

Проверено это работает.

Смежные вопросы