Как получить переменную 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.