Conversor de docker run a Docker Compose (y al revés)

Convierte un comando docker run en un servicio de docker-compose.yml, o un servicio de Compose de vuelta en docker run.

Ejemplos:
Se admiten comandos de varias líneas con continuaciones \, comillas y la forma --opción=valor.
docker-compose.yml
services:
  db:
    image: postgres:16
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: change-me
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "127.0.0.1:5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
volumes:
  pgdata:
    name: pgdata
Notas
  • Se descartó -d / --detach: usa "docker compose up -d" para ejecutarlo en segundo plano.
  • Los volúmenes con nombre conservan su nombre exacto ("name:") para que Compose reutilice el volumen que creó docker run en lugar de crear uno nuevo y vacío "<proyecto>_<volumen>".

Funciona por completo en tu navegador. Los comandos y los archivos Compose, incluidas las contraseñas que contengan, nunca se envían a ningún sitio. Ver todas las herramientas gratis.

¿Encontraste un problema o algo que podría mejorar? Leemos todos los mensajes y lo arreglamos rápido.

Este conversor de docker run a Docker Compose transforma un comando docker run, como los que copias del README de un proyecto, en un servicio de docker-compose.yml: puertos, volúmenes, variables de entorno, redes, política de reinicio, healthcheck, capabilities, dispositivos, acceso a GPU y decenas de opciones más. También funciona al revés y convierte cada servicio de un archivo Compose en el comando docker run equivalente, para una prueba rápida o un sistema sin Compose.

La conversión cuida los detalles que rompen los despliegues reales. Los puertos van entre comillas, porque YAML 1.1 lee un 22:22 sin comillas como un número en base 60. Los volúmenes con nombre conservan su nombre exacto, para que Compose reutilice los datos que creó docker run en lugar de empezar con un “<proyecto>_<volumen>” vacío. $(pwd) se convierte en una ruta relativa. Los flags que solo afectan a la sesión de la CLI, como -d y --rm, se descartan con una nota, y todo lo que no tiene equivalente en Compose aparece como aviso en lugar de perderse sin decir nada.

Cómo usarla

  1. Pega un comando docker run en el cuadro de la izquierda o haz clic en un ejemplo. Los comandos de varias líneas con barras invertidas también valen.
  2. Lee el docker-compose.yml generado a la derecha y revisa las notas y avisos que aparecen debajo.
  3. Copia el YAML o descárgalo como docker-compose.yml, ponlo en el directorio de tu proyecto y ejecuta docker compose up -d.
  4. Para el sentido contrario, cambia a “Compose → docker run”, pega un archivo Compose y copia el comando de cada servicio.

Preguntas frecuentes

¿Qué diferencia hay entre docker run y docker compose?

docker run inicia un contenedor a partir de opciones en la línea de comandos. Docker Compose describe uno o varios contenedores, sus redes y volúmenes en un archivo YAML y los inicia juntos con docker compose up. Compose es más fácil de mantener en el control de versiones, de revisar y de volver a ejecutar de forma idéntica, y los servicios de un mismo proyecto Compose pueden comunicarse entre sí por el nombre del servicio.

¿Sigo necesitando la línea version: en docker-compose.yml?

No. La clave version de nivel superior está obsoleta en la Compose Specification que usa Docker Compose v2, y las versiones actuales muestran un aviso de que se ignora. Este conversor no la incluye. Hoy en día los archivos suelen llamarse compose.yaml, aunque docker-compose.yml se sigue leyendo.

¿Por qué faltan los datos de mi volumen después de pasarme a Compose?

Compose antepone el nombre del proyecto a los volúmenes con nombre, así que un volumen llamado pgdata pasa a ser myproject_pgdata, que es un volumen nuevo y vacío. Para reutilizar el volumen que creó docker run, decláralo en el nivel superior con name: pgdata (este conversor lo hace) o márcalo como external: true. Los bind mounts (rutas que empiezan por / o ./) no se ven afectados.

¿Qué pasa con -d, -it y --rm?

-d es una propiedad de cómo inicias los contenedores, así que usa docker compose up -d. -i y -t se convierten en stdin_open: true y tty: true. --rm no tiene equivalente por servicio: docker compose down elimina los contenedores, y docker compose run --rm existe para comandos puntuales.

¿Cómo se convierten las opciones de GPU?

--gpus all se convierte en una reserva de dispositivo en deploy.resources.reservations.devices con driver: nvidia, count: all y capabilities: [gpu], que es la forma documentada para Docker Compose. Las GPU concretas (--gpus '"device=0,1"') se convierten en device_ids. Sigues necesitando el NVIDIA Container Toolkit instalado en el host.

¿Se envía mi comando a un servidor?

No. El análisis y la conversión se hacen en tu navegador, así que las variables de entorno, las contraseñas y los nombres de host internos del comando nunca salen de tu equipo. Aun así, trata un archivo Compose que contiene secretos como un archivo de contraseñas: muévelos a un env_file que esté en .gitignore.

Flags de docker run y sus claves en Compose

• -p 8080:80 → ports: ["8080:80"] · --expose → expose

• -v /host:/ctr o -v name:/ctr → volumes · --mount → volumes con sintaxis larga · --tmpfs → tmpfs

• -e KEY=value → environment · --env-file → env_file · -l / --label → labels

• --name → container_name · -h → hostname · -u → user · -w → working_dir

• --restart → restart · --network → networks o network_mode (host, none, container:…) · --network-alias, --ip → aliases e ipv4_address por red

• --entrypoint → entrypoint · argumentos después de la imagen → command

• --health-cmd/-interval/-timeout/-retries/-start-period → healthcheck · --no-healthcheck → healthcheck.disable

• --cap-add/--cap-drop → cap_add/cap_drop · --device → devices · --privileged, --read-only, --init → los mismos nombres

• -m / --memory → mem_limit · --cpus → cpus · --shm-size → shm_size · --ulimit → ulimits · --sysctl → sysctls

• --log-driver/--log-opt → logging · --add-host → extra_hosts · --dns → dns · --gpus → deploy.resources.reservations.devices

Después de convertir: conviértelo en un proyecto Compose de verdad

Una conversión uno a uno es un punto de partida. Cuando varios contenedores conviven en un mismo archivo, sustituye --link y las IP de contenedor fijas por nombres de servicio (la aplicación llega a la base de datos en db:5432), añade depends_on con condition: service_healthy para que la aplicación espere al healthcheck de la base de datos y quita container_name salvo que algo fuera de Compose necesite un nombre fijo, ya que impide escalar el servicio. Pasa las contraseñas de environment a un archivo .env o a los secrets de Compose, y deja ese archivo fuera de Git.

Herramientas gratis relacionadas

  • Calculadora de subredes — Red, broadcast, rango de hosts y máscara para cualquier CIDR; divide redes con VLSM, expande IPv6 y encuentra rangos que se solapan.
  • Calculadora chmod — Marca las casillas de lectura, escritura y ejecución para obtener el modo octal y el comando chmod, o descifra 755, 644 y rwxr-xr-x.
  • Generador de .gitignore — Combina plantillas de .gitignore para lenguajes, frameworks, editores y sistemas operativos en un solo archivo limpio.
  • Formateador JSON — Formatea, minifica y valida JSON, con los errores de análisis localizados por línea y columna. En tu navegador, sin subir nada.
  • Generador de expresiones cron — Crea una programación cron con menús desplegables o pega una, léela en lenguaje claro y ve las 10 próximas ejecuciones en tu zona horaria y en UTC. Gratis, en tu navegador.