I recently hit an issue with my server which caused me to format my drive running Ubuntu, this caused me to lose my whole docker setup on that system. As an idiot, I didn’t have any redundancies in place for such an event.

This lead me to have to re-set up each docker container I had originally, thankfully the volumes were separate, so all I needed was the compose files/run commands for each container, env var, and volume mappings.

With everything setup again, this sent me down a rabbit hole, looking to see if there was a way to back up my docker commands moving forward. Looking online, I can’t see anywhere that shown how you can export your current docker containers as run commands for Linux.

I’ve now managed to create the below shell script, this will build the docker “run” commands complete with env vars, volume mappings, ports, IPs

#!/bin/bash

# Create the "docker_run" directory if it doesn't exist
mkdir -p docker_run

# Get a list of all running containers
containers=$(docker ps -q)

# Iterate over the containers and create individual sh files for each "docker run" command
for container_id in $containers; do
    # Get container information
    container_info=$(docker inspect $container_id)
    
    # Extract container name, image name, and environment variables
    container_name=$(echo $container_info | jq -r '.[0].Name' | cut -d "/" -f 2)
    image_name=$(echo $container_info | jq -r '.[0].Config.Image')
    
    # Extract and format environment variables
    env_vars=$(echo $container_info | jq -r '.[0].Config.Env | .[]' | sed 's/^/-e /' | tr '\n' ' ')

    # Extract container port mappings
    port_mappings=$(echo $container_info | jq -r '.[0].NetworkSettings.Ports | to_entries | .[] | .key + ":" + .value[0].HostPort' | tr '\n' ' ')

    # Extract container IP address and network
    container_ip=$(echo $container_info | jq -r '.[0].NetworkSettings.Networks | to_entries | .[] | .value.IPAddress')
    container_network=$(echo $container_info | jq -r '.[0].NetworkSettings.Networks | keys[0]')

    # Extract and format volume information
    volumes=$(echo $container_info | jq -r '.[0].Mounts | .[] | "-v " + .Source + ":" + .Destination' | tr '\n' ' ')

    # Create the "docker run" command with network, env vars, ports, IP assignment, and volumes
    docker_run_command="docker run -d --name $container_name --network $container_network --ip $container_ip $env_vars -p $port_mappings $volumes $image_name"

    # Create a shell file with the run command
    sh_file_contents="#!/bin/bash\n\n$docker_run_command"
    echo -e "$sh_file_contents" > "docker_run/$container_name.sh"
    # Make the file executable
    chmod +x "docker_run/$container_name.sh"
done

I don’t know if this would be helpful for other, but it’s certainly helping me, so I thought I’d post it to see if others would like the same.

This will create the “run” commands and store them in a directory “docker_run/{container_name}.sh” so should you ever need to set up a container again you would just need to run the .SH file and the container would pick up from where it last left off.

I’ve personally set this up as a cronjob, to keep my files updated regularly.

There are probably other ways to go about doing this, however this seems to work for me.