How to get ENV variable when doing Docker Inspect

前端 未结 8 1254
鱼传尺愫
鱼传尺愫 2020-11-30 05:12

I wonder how I get an Environment variable from docker inspect.

when i run

docker inspect -f \"{{.Config.Env.PATH}} \" 1e2b8689cf06
相关标签:
8条回答
  • 2020-11-30 05:15

    If you want want to be able to check success of operation you could go with:

    (
    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
    )
    

    This will open a subshell and return depending if found:

    $ 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
    $
    
    0 讨论(0)
  • 2020-11-30 05:18
    docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' CONTAINER-NAME | grep -P "^YOUR_VAR=" | sed 's/[^=]*=//'
    

    This solution requires grep(with -P option), sed and ability to pipeline them but solves 2 problems which most of the other solutions do not.

    Firstly, it performs exact match on variable name. For example if you have following variables:

    YOUR_VAR=value
    ANOTHER_YOUR_VAR=value2
    OTHER_VAR=YOUR_VAR
    

    You will properly receive value.

    Secondly, it properly handles cases where variable value contains = characters. For example:

    REBEL_OPTS=-Drebel.stats=false
    

    Will properly get you -Drebel.stats=false instead of false.

    0 讨论(0)
  • 2020-11-30 05:26

    Docker formatting options are quite limited, jq is much more powerful:

    docker inspect 1e2b8689cf06 | jq '.[] | .Config.Env[] | select(test("^PATH=*"))'
    

    or combine Docker format with jq while passing only Env variables to jq:

    docker inspect -f '{{json .Config.Env }}' 1e2b8689cf06 | jq '.[] | select(test("^PATH=*"))'
    

    Assuming there's a printenv in the container, you can use simple grep:

    docker exec -i 1e2b8689cf06 printenv | grep -oP '(?<=PATH=).*'
    

    -o would omit matching PATH= part from result. The syntax is much easier to read than the template magic.

    0 讨论(0)
  • 2020-11-30 05:32

    For those looking for a template-only solution using only docker inspect (when you can't just shell out and grep, etc.), the following example works (as of docker 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*
    
    • it even handles environment variables with extra '='

    Example container:

    > docker run -d -e --name sleeper SOME_VAR=key=value alpine:3.4 -sh 'sleep 9999'
    

    Extract SOME_VAR with:

    > 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
    
    0 讨论(0)
  • 2020-11-30 05:33

    You can get directly with a command similar to

    docker inspect --format '{{ index (index .Config.Env) 1 }}' 797
    

    which shows for me

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    You will notice that replacing the 1 by 0 like

    docker inspect --format '{{ index (index .Config.Env) 0 }}' 797
    

    gives

    DISPLAY=:0
    

    In fact I had noticed the following for various docker inspect from a more general to a more precise display

    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
    

    Note: docker inspect -f works and is shorter, of course, I posted the "old" syntax.

    0 讨论(0)
  • 2020-11-30 05:36

    This doesn't seem to be possible, you can list the environment variables but not just one.

    From the 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]
    

    You can print them:

    docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}'
    

    (as in)

    $ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' c3fa3ce1622b
    HOME=/
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    Add a grep PATH and you could get only the PATH=xxx value.


    user2915097 mentions in the comments jq, a lightweight and flexible command-line JSON processor, used in the article "Docker Inspect Template Magic " to format nicely the needed field:

    docker inspect -f '{{json .State}}' jenkins-data | jq '.StartedAt' 
      "2015-03-15T20:26:30.526796706Z"
    
    0 讨论(0)
提交回复
热议问题