Created
December 15, 2025 12:34
-
-
Save localzet/cfdddfa8297081a8f689737e3fd2c40a to your computer and use it in GitHub Desktop.
Generate docker-compose from running containers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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