Skip to content

Instantly share code, notes, and snippets.

@miracle2k
Created July 6, 2014 12:19
Show Gist options
  • Save miracle2k/c85b7b077fdb8d54bc89 to your computer and use it in GitHub Desktop.
Save miracle2k/c85b7b077fdb8d54bc89 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"
}
@amine250
Copy link

Note: volumes are missing.

@weshouman
Copy link

Here's with volumes too:

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(" ")')
    
    # Parse port mappings
    mapped_to_container=`(echo $json| jq '.[0].NetworkSettings.Ports' | jq 'to_entries[] | .key' | tr -d '"' | cut -f 1- -d\/ --output-delimiter=$'\n' )`
    mapped_to_host=$(echo $json | jq -r '.[0].NetworkSettings.Ports | to_entries | map(.value[].HostPort) | 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="-p ${array[i]}:${array2[b]}"
                ports_result+=($port_map)
            fi
        done
    done

    # Parse volume information
    volumes=$(echo $json | jq -r '.[0].Mounts | map("-v " + .Source + ":" + .Destination) | join(" ")')

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

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