Skip to content

SHORTY – Generate docker run commands using docker-replay

If you’re forgetful like me, you have to wrote everything down to remember what you did later. For Docker, this hits me quite hard for every “docker run” command I’ve ever issued. What was the env setting like? On which port did I ran the container? I found a small little Python project called “docker-replay” quite useful to generate docker run commands out of running containers for me.

This will be a short one, I promise, cause the official documentation is really enough to get it all described. I just want to show you a real world example using it on my PostgreSQL container, running in my Homelab.

First step is, to install docker-replay on your Docker host. To do so, you need Python pip installed and innstall “docker-replay” using the following command:

> pip install docker-replay

Collecting docker-replay
  Downloading docker_replay-1.5-py2.py3-none-any.whl (7.1 kB)
Requirement already satisfied: docker>=2.4.2 in /usr/local/lib/python3.8/dist-packages (from docker-replay) (4.4.4)
Requirement already satisfied: requests!=2.18.0,>=2.14.2 in /usr/lib/python3/dist-packages (from docker>=2.4.2->docker-replay) (2.22.0)
Requirement already satisfied: six>=1.4.0 in /usr/lib/python3/dist-packages (from docker>=2.4.2->docker-replay) (1.14.0)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python3.8/dist-packages (from docker>=2.4.2->docker-replay) (0.58.0)
Installing collected packages: docker-replay
Successfully installed docker-replay-1.5

Now you’re good to go to run “docker-replay” on an already running container to generate the according docker run command. With that, you could everytime recreate your container setup. Let’s run it against my Postgresql container using the -p option for a pretty output.

> docker-replay -p Postgresql
docker run --cap-add AUDIT_WRITE \
           --cap-add CHOWN \
           --cap-add DAC_OVERRIDE \
           --cap-add FOWNER \
           --cap-add FSETID \
           --cap-add KILL \
           --cap-add MKNOD \
           --cap-add NET_BIND_SERVICE \
           --cap-add NET_RAW \
           --cap-add SETFCAP \
           --cap-add SETGID \
           --cap-add SETPCAP \
           --cap-add SETUID \
           --cap-add SYS_CHROOT \
           --cap-drop AUDIT_CONTROL \
           --cap-drop BLOCK_SUSPEND \
           --cap-drop DAC_READ_SEARCH \
           --cap-drop IPC_LOCK \
           --cap-drop IPC_OWNER \
           --cap-drop LEASE \
           --cap-drop LINUX_IMMUTABLE \
           --cap-drop MAC_ADMIN \
           --cap-drop MAC_OVERRIDE \
           --cap-drop NET_ADMIN \
           --cap-drop NET_BROADCAST \
           --cap-drop SYSLOG \
           --cap-drop SYS_ADMIN \
           --cap-drop SYS_BOOT \
           --cap-drop SYS_MODULE \
           --cap-drop SYS_NICE \
           --cap-drop SYS_PACCT \
           --cap-drop SYS_PTRACE \
           --cap-drop SYS_RAWIO \
           --cap-drop SYS_RESOURCE \
           --cap-drop SYS_TIME \
           --cap-drop SYS_TTY_CONFIG \
           --cap-drop WAKE_ALARM \
           --entrypoint "docker-entrypoint.sh" \
           --env GOSU_VERSION=1.12 \
           --env LANG=en_US.utf8 \
           --env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/13/bin \
           --env PGDATA=/var/lib/postgresql/data/pgdata \
           --env PG_MAJOR=13 \
           --env PG_VERSION=13.5-1.pgdg110+1 \
           --env POSTGRES_PASSWORD=supersecret\
           --expose 5432/tcp \
           --hostname 323259508c7a \
           --ip 172.17.0.7 \
           --ipc private \
           --log-driver json-file \
           --mac-address 02:42:ac:11:00:07 \
           --name Postgresql \
           --net bridge \
           --publish 5432:5432/tcp \
           --restart unless-stopped \
           --shm-size 64m \
           --volume /docker/postgresql13/backup:/var/lib/postgresql/backup \
           --volume /docker/postgresql13/pgdata:/var/lib/postgresql/data \
           --volume /etc/passwd:/etc/passwd:ro \
           postgres:13 \
           postgres

Let’s adjust the volumes and the port and try to spin up a “clone” of our container using else the same configuration. Cause we spin in up as a clone, we also need to remove the parameters --mac-address and --ip. Also we want to add the -d option to detach from the container after it’s getting started.

docker run -d \
		   --cap-add AUDIT_WRITE \
           --cap-add CHOWN \
           --cap-add DAC_OVERRIDE \
           --cap-add FOWNER \
           --cap-add FSETID \
           --cap-add KILL \
           --cap-add MKNOD \
           --cap-add NET_BIND_SERVICE \
           --cap-add NET_RAW \
           --cap-add SETFCAP \
           --cap-add SETGID \
           --cap-add SETPCAP \
           --cap-add SETUID \
           --cap-add SYS_CHROOT \
           --cap-drop AUDIT_CONTROL \
           --cap-drop BLOCK_SUSPEND \
           --cap-drop DAC_READ_SEARCH \
           --cap-drop IPC_LOCK \
           --cap-drop IPC_OWNER \
           --cap-drop LEASE \
           --cap-drop LINUX_IMMUTABLE \
           --cap-drop MAC_ADMIN \
           --cap-drop MAC_OVERRIDE \
           --cap-drop NET_ADMIN \
           --cap-drop NET_BROADCAST \
           --cap-drop SYSLOG \
           --cap-drop SYS_ADMIN \
           --cap-drop SYS_BOOT \
           --cap-drop SYS_MODULE \
           --cap-drop SYS_NICE \
           --cap-drop SYS_PACCT \
           --cap-drop SYS_PTRACE \
           --cap-drop SYS_RAWIO \
           --cap-drop SYS_RESOURCE \
           --cap-drop SYS_TIME \
           --cap-drop SYS_TTY_CONFIG \
           --cap-drop WAKE_ALARM \
           --entrypoint "docker-entrypoint.sh" \
           --env GOSU_VERSION=1.12 \
           --env LANG=en_US.utf8 \
           --env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/13/bin \
           --env PGDATA=/var/lib/postgresql/data/pgdata \
           --env PG_MAJOR=13 \
           --env PG_VERSION=13.5-1.pgdg110+1 \
           --env POSTGRES_PASSWORD=supersecret \
           --expose 5432/tcp \
           --hostname 323259508c7a \
           --ipc private \
           --log-driver json-file \
           --name Postgresql-clone \
           --net bridge \
           --publish 5433:5432/tcp \
           --restart unless-stopped \
           --shm-size 64m \
           --volume /docker/postgresql13-clone/backup:/var/lib/postgresql/backup \
           --volume /docker/postgresql13-clone/pgdata:/var/lib/postgresql/data \
           --volume /etc/passwd:/etc/passwd:ro \
           postgres:13 \
           postgres

2046a6af19a2ff77e8c2668a8a70398c378ec91a2020b4cb273824cc3c55fc87

A look into docker ps shows us a healthy cloned container with mostly the same config.

Philip

Leave a Reply

Your email address will not be published. Required fields are marked *