Skip to content

Instantly share code, notes, and snippets.

@localzet
Created December 15, 2025 12:34
Show Gist options
  • Select an option

  • Save localzet/cfdddfa8297081a8f689737e3fd2c40a to your computer and use it in GitHub Desktop.

Select an option

Save localzet/cfdddfa8297081a8f689737e3fd2c40a to your computer and use it in GitHub Desktop.
Generate docker-compose from running containers
#!/bin/bash
# Папка для генерации
OUTPUT_DIR="docker-compose_projects"
mkdir -p $OUTPUT_DIR
# Собираем все контейнеры
docker ps --format '{{.Names}}' | while read CONTAINER; do
# Получаем проект из лейбла
PROJECT=$(docker inspect --format='{{index .Config.Labels "com.docker.compose.project"}}' $CONTAINER)
[ -z "$PROJECT" ] && PROJECT="default"
FILE="$OUTPUT_DIR/$PROJECT.yml"
# Если файл ещё не существует, создаём заголовок
if [ ! -f "$FILE" ]; then
echo "version: '3.8'" > $FILE
echo "services:" >> $FILE
fi
echo " $CONTAINER:" >> $FILE
IMAGE=$(docker inspect --format='{{.Config.Image}}' $CONTAINER)
echo " image: $IMAGE" >> $FILE
# Command
CMD=$(docker inspect --format='{{json .Config.Cmd}}' $CONTAINER)
if [ "$CMD" != "null" ]; then
echo " command: $CMD" >> $FILE
fi
# Working dir
WORKDIR=$(docker inspect --format='{{.Config.WorkingDir}}' $CONTAINER)
[ -n "$WORKDIR" ] && echo " working_dir: $WORKDIR" >> $FILE
# User
USER=$(docker inspect --format='{{.Config.User}}' $CONTAINER)
[ -n "$USER" ] && echo " user: $USER" >> $FILE
# Hostname
HOSTNAME=$(docker inspect --format='{{.Config.Hostname}}' $CONTAINER)
[ -n "$HOSTNAME" ] && echo " hostname: $HOSTNAME" >> $FILE
# Порты
PORTS=$(docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{$p}}:{{(index $conf 0).HostPort}}{{end}} {{end}}' $CONTAINER)
if [ -n "$PORTS" ]; then
echo " ports:" >> $FILE
for PORT in $PORTS; do
echo " - \"$PORT\"" >> $FILE
done
fi
# Томы
VOLUMES=$(docker inspect --format='{{range .Mounts}}{{printf "%s:%s\n" .Source .Destination}}{{end}}' $CONTAINER)
if [ -n "$VOLUMES" ]; then
echo " volumes:" >> $FILE
while read VOL; do
[ -n "$VOL" ] && echo " - $VOL" >> $FILE
done <<< "$VOLUMES"
fi
# Env
ENV_VARS=$(docker inspect --format='{{range .Config.Env}}{{.}}{{"\n"}}{{end}}' $CONTAINER)
if [ -n "$ENV_VARS" ]; then
echo " environment:" >> $FILE
while read ENV; do
[ -n "$ENV" ] && echo " - $ENV" >> $FILE
done <<< "$ENV_VARS"
fi
# Restart
RESTART=$(docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' $CONTAINER)
[ -n "$RESTART" ] && [ "$RESTART" != "no" ] && echo " restart: $RESTART" >> $FILE
# Networks
NETWORKS=$(docker inspect --format='{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}' $CONTAINER)
if [ -n "$NETWORKS" ]; then
echo " networks:" >> $FILE
for NET in $NETWORKS; do
echo " - $NET" >> $FILE
done
fi
# Labels
LABELS=$(docker inspect --format='{{range $k,$v := .Config.Labels}}{{$k}}={{$v}}{{"\n"}}{{end}}' $CONTAINER)
if [ -n "$LABELS" ]; then
echo " labels:" >> $FILE
while read LAB; do
[ -n "$LAB" ] && echo " - $LAB" >> $FILE
done <<< "$LABELS"
fi
echo "" >> $FILE
done
# Создаём секцию сетей для каждого файла (только реально используемые)
for FILE in $OUTPUT_DIR/*.yml; do
echo "networks:" >> $FILE
grep -Po '(?<=networks:\n)(\s+-\s+\S+)' $FILE | sed 's/^\s\+- //' | sort -u | while read NET; do
echo " $NET:" >> $FILE
done
done
echo "Сгенерированы docker-compose файлы по проектам в папке $OUTPUT_DIR"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment