Skip to content

Instantly share code, notes, and snippets.

@ludwig
Forked from miracle2k/.bashrc
Created October 9, 2019 00:05
Show Gist options
  • Save ludwig/9eb5a2de0f42aff9b622791832747eb9 to your computer and use it in GitHub Desktop.
Save ludwig/9eb5a2de0f42aff9b622791832747eb9 to your computer and use it in GitHub Desktop.
Convert an existing docker container into a "docker run" command line
# Convert an existing docker container into a "docker run" command line.
#
# This is useful when trying to debug containers that have been created
# by orchestration tools.
#
# Install jq: stedolan.github.io/jq/
function format_run() {
cid=$1
json=$(docker inspect $cid 2>&1)
# parse container info
entrypoint=$( echo $json | jq -r '.[0].Config.Entrypoint | join(" ")' )
envvars=$( echo $json | jq -r '(.[0].Config.Env | [" -e " + .[]] | join(""))' )
image=$( echo $json | jq -r .[0].Image )
cmd=$( echo $json | jq -r '.[0].Config.Cmd | join(" ")' )
echo "docker run --entrypoint $entrypoint $envvars $image $cmd"
}
@ludwig
Copy link
Author

ludwig commented Oct 9, 2019

Comment from upstream fork:

This with ports mapping:

function format_run() {
    cid=$1

    json=$(docker inspect $cid 2>&1)

    # parse container info
    entrypoint=$(  echo $json | jq -r '.[0].Config.Entrypoint | join(" ")'             )
    envvars=$(     echo $json | jq -r '(.[0].Config.Env | [" -e " + .[]] | join(""))'  )
    image=$(       echo $json | jq -r .[0].Image                                       )
    cmd=$(         echo $json | jq -r '.[0].Config.Cmd | join(" ")'                    )
    mapped_to_container=`(echo $json| jq '.[0].NetworkSettings .Ports' | jq '.[]' | jq '.[]' | jq '.HostPort' | tr -d '"' | cut -f 1- -d\/ --output-delimiter=$'\n' )`
    mapped_to_host=$(echo $json | jq -r '.[0].NetworkSettings.Ports | keys | to_entries |  map(.value) | join(" ")')

    array=(${mapped_to_container// / })
    array2=(${mapped_to_host// / })

    ports_result=()

    for i in "${!array[@]}"
    do
        for b in "${!array2[@]}"
        do
          if [[ "$i" == "$b" ]];
          then
            port_map=`(echo "-p ${array[i]}:${array2[b]}")`
            ports_result+=($port_map)
          fi
         done
    done

    echo "docker run --entrypoint $entrypoint $envvars ${ports_result[@]} $image $cmd"
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment