Как получить переменную ENV при выполнении Docker Inspect
Интересно, как получить переменную среды из проверки докеров.
когда я запустил
docker inspect -f "{{.Config.Env.PATH}} " 1e2b8689cf06
я получаю следующее
FATA[0000] template: :1:9: executing "" at <.Config.Env.PATH>: can't evaluate field PATH in type interface {}
Ответы
Ответ 1
Вы можете получить непосредственно с помощью команды, аналогичной
docker inspect --format '{{ index (index .Config.Env) 1 }}' 797
который показывает мне
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Вы заметите, что замена 1
на 0
как
docker inspect --format '{{ index (index .Config.Env) 0 }}' 797
дает
DISPLAY=:0
Фактически я заметил следующее для различных docker inspect
от более общего к более точному отображению
docker inspect --format '{{ (.NetworkSettings.Ports) }}' 87c
map[8000/tcp:[map[HostIp:0.0.0.0 HostPort:49153]]]
docker inspect --format '{{ ((index .NetworkSettings.Ports "8000/tcp") 0) }}' 87c
[map[HostIp:0.0.0.0 HostPort:49153]]
docker inspect --format '{{ index (index .NetworkSettings.Ports "8000/tcp") 0 }}' 87c
map[HostIp:0.0.0.0 HostPort:49153]
docker inspect --format '{{ (index (index .NetworkSettings.Ports "8000/tcp") 0).HostIp }}' 87c
0.0.0.0
docker inspect --format '{{ (index (index .NetworkSettings.Ports "8000/tcp") 0).HostPort }}' 87c
49153
Примечание: docker inspect -f
работает и короче, конечно, я разместил "старый" синтаксис.
Ответ 2
Это не представляется возможным, вы можете перечислить переменные окружения, но не только один.
Из docker commit doc
$ sudo docker inspect -f "{{ .Config.Env }}" c3f279d17e0a
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
$ sudo docker commit --change "ENV DEBUG true" c3f279d17e0a SvenDowideit/testimage:version3
f5283438590d
$ sudo docker inspect -f "{{ .Config.Env }}" f5283438590d
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true]
Вы можете распечатать их:
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}'
(как в)
$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' c3fa3ce1622b
HOME=/
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Добавьте grep PATH
, и вы можете получить только значение PATH=xxx
.
user2915097 упоминает в комментариях jq, легкий и гибкий процессор JSON командной строки, используемый в статье " Docker Inspect Template Magic" для удобного форматирования необходимого поля:
docker inspect -f '{{json .State}}' jenkins-data | jq '.StartedAt'
"2015-03-15T20:26:30.526796706Z"
Ответ 3
Очень удобный вариант, который не требует каких-либо внешних инструментов:
docker exec 1e2b8689cf06 sh -c 'echo $PATH'
По общему признанию, это не используется docker inspect
, но все же..
Ответ 4
Мне удобнее анализировать переменную имя для вас, чем полагаться на индекс.
echo $(docker inspect --format '{{ .Config.Env }}' mysql) | tr ' ' '\n' | grep MYSQL_ROOT_PASSWORD | sed 's/^.*=//'
Ответ 5
Для тех, кто ищет решение только для шаблонов, используя только проверку докеров (когда вы не можете просто раскошеливать и grep и т.д.), следующий пример работает (с докера 1.11 +):
> docker inspect -f '{{range $index, $value := .Config.Env}}{{if eq (index (split $value "=") 0) "SOME_VAR" }}{{range $i, $part := (split $value "=")}}{{if gt $i 1}}{{print "="}}{{end}}{{if gt $i 0}}{{print $part}}{{end}}{{end}}{{end}}{{end}}' *container_name*
- он даже обрабатывает переменные среды с дополнительными '='
Пример контейнера:
> docker run -d -e --name sleeper SOME_VAR=key=value alpine:3.4 -sh 'sleep 9999'
Извлечь SOME_VAR
с помощью:
> docker inspect -f '{{range $index, $value := .Config.Env}}{{if eq (index (split $value "=") 0) "SOME_VAR" }}{{range $i, $part := (split $value "=")}}{{if gt $i 1}}{{print "="}}{{end}}{{if gt $i 0}}{{print $part}}{{end}}{{end}}{{end}}{{end}}' sleeper
Ответ 6
Если вы хотите, чтобы у вас была возможность проверить успех операции, вы можете пойти с:
(
for env in $(docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' ${2}); do
if [[ "${env}" == "${1}"* ]]; then
echo ${env#${1}=}
exit 0
fi
done
exit 1
)
Это откроет подоболочку и вернется в зависимости от найденного:
$ docker-extract PATH docker_image || echo not found
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ docker-extract NON_EXISTENT_ENV docker_image || echo not found
not found
$
Ответ 7
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' CONTAINER-NAME | grep -P "^YOUR_VAR=" | sed 's/[^=]*=//'
Для этого решения требуется grep
(с опцией -P), sed
и возможность конвейера, но решает две проблемы, которые не подходят большинству других решений.
Во-первых, он выполняет точное совпадение имени переменной. Например, если у вас есть следующие переменные:
YOUR_VAR=value
ANOTHER_YOUR_VAR=value2
OTHER_VAR=YOUR_VAR
Вы правильно получите value
.
Во-вторых, он правильно обрабатывает случаи, когда значение переменной содержит символы =
. Например:
REBEL_OPTS=-Drebel.stats=false
Будет правильно получить вас -Drebel.stats=false
вместо false
.