Conversor de docker run para Docker Compose

Converta comandos docker run em compose.yaml: portas, volumes, variáveis, redes, healthcheck e limites viram chaves do Compose. Grátis, direto no navegador.

Converter docker run em compose.yaml

Cole um ou mais comandos docker run e receba o compose.yaml equivalente, pronto para copiar ou baixar. Cada comando vira um serviço no mesmo arquivo.

Aceita docker container run, podman run, linhas continuadas com \ ou crase (PowerShell) e vários comandos de uma vez — cada um vira um serviço.

Exemplos:

Cole um comando acima ou toque em um exemplo. A conversão é feita no seu navegador: nada é enviado.

Como usar

  1. Cole o comando completo, começando por docker run (também valem docker container run, docker create, podman run e sudo docker run).
  2. Comandos em várias linhas funcionam com \ no fim da linha (bash), crase (PowerShell) ou ^ (Prompt de Comando).
  3. Confira os avisos abaixo do resultado: eles listam o que foi ignorado e o que merece revisão.
  4. Copie o YAML ou baixe o arquivo, salve como compose.yaml na pasta do projeto e rode docker compose up -d.

A conversão acontece no seu navegador. O comando — que costuma ter senhas em variáveis de ambiente — não é enviado a nenhum servidor.

Por que trocar docker run por Compose

Um docker run longo guarda toda a configuração do contêiner em uma linha que só existe no histórico do terminal. O Compose coloca a mesma configuração em um arquivo YAML que pode ser versionado no Git, revisado e reutilizado. Subir, atualizar e derrubar o ambiente passa a ser docker compose up -d, docker compose pull e docker compose down, e vários contêineres que trabalham juntos ficam descritos no mesmo lugar.

Como cada flag é convertida

docker runCompose
--namecontainer_name (e nome do serviço)
-p, --publishports
-v, --volume, --mountvolumes (volumes nomeados também em volumes: no topo)
-e, --env / --env-fileenvironment / env_file
--restartrestart
--network, --netnetworks ou network_mode (host, none, bridge, container:nome)
--network-alias, --ipaliases e ipv4_address dentro da rede
-h, -w, -uhostname, working_dir, user
--entrypoint / argumentos após a imagementrypoint / command
-l, --add-host, --dnslabels, extra_hosts, dns
--cap-add, --cap-drop, --privileged, --devicecap_add, cap_drop, privileged, devices
--memory, --cpusmem_limit, cpus (ou deploy.resources.limits)
--shm-size, --ulimit, --sysctl, --tmpfsshm_size, ulimits, sysctls, tmpfs
--log-driver, --log-optlogging.driver, logging.options
--health-cmd, --health-interval…healthcheck (test, interval, timeout, retries, start_period)
--read-only, --init, -t, -iread_only, init, tty, stdin_open
--pid, --ipc, --security-opt, --platformpid, ipc, security_opt, platform
--stop-signal, --stop-timeoutstop_signal, stop_grace_period
--expose, --link, --pullexpose, links, pull_policy
--gpusdeploy.resources.reservations.devices

Um exemplo completo:

docker run -d --name site -p 8080:80 \
  -v ./html:/usr/share/nginx/html:ro \
  --restart unless-stopped nginx:alpine
services:
  site:
    image: nginx:alpine
    container_name: site
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro

O que não tem equivalente

  • -d (detach): não vai no arquivo. Quem decide é o comando: docker compose up -d.
  • --rm: também não existe no arquivo. docker compose down remove os contêineres; para tarefas avulsas, use docker compose run --rm serviço.
  • -P, -a, --cidfile, --sig-proxy: são opções do terminal ou do cliente, sem chave na especificação.

Essas flags aparecem na lista “Ignoradas”, com a explicação. Flags que a ferramenta não conhece são listadas à parte e o restante do comando é convertido normalmente.

Detalhes que fazem diferença

Sem o campo version. A Compose Specification atual trata version como obsoleto: ele é apenas informativo, o Compose valida o arquivo sempre com o esquema mais recente e ainda mostra um aviso quando o campo está presente. Por isso o resultado começa direto em services:. O nome de arquivo preferido é compose.yaml (o antigo docker-compose.yml continua aceito).

Portas entre aspas. O YAML 1.1 lê valores como 22:22 em base 60, e a documentação do Compose recomenda escrever os mapeamentos de porta sempre como texto. A ferramenta põe aspas em todas as portas e em qualquer valor que o YAML poderia interpretar de outro jeito: yes, no, on, off, números que precisam ser texto ("3" em max-file), textos com : ou # e os que começam com *, & ou !.

Memória e CPU. --memory 512m --cpus 1.5 vira mem_limit: 512m e cpus: 1.5, chaves do serviço que continuam na especificação e correspondem uma a uma às flags. Se você prefere o bloco deploy.resources.limits (o formato usado também no Swarm), troque a opção acima do resultado. A especificação pede que as duas formas, quando usadas juntas, tenham valores coerentes — escolha uma só.

Cifrão. O Compose interpola $VAR e ${VAR} a partir do ambiente e do arquivo .env. Um cifrão que era literal no shell (entre aspas simples ou escrito como \$) é dobrado para $$, que é como o Compose representa um $ de verdade. Variáveis sem aspas simples são mantidas e listadas nos avisos.

Volumes e redes. No docker run, -v dados:/data cria um volume chamado exatamente dados. Declarado no Compose, o volume ganha o prefixo do projeto (pasta_dados). Para reaproveitar um volume que já existe, marque “Volumes já existem” e ele sai com external: true. Com redes é o contrário: --network minha-rede só funciona se a rede já existir, então o padrão é external: true; desmarque para o Compose criar a rede.

Pasta atual. $(pwd), $PWD e %cd% no início de um volume viram ., porque o Compose resolve caminhos relativos a partir da pasta do arquivo.

Limitações

  • A ferramenta não consulta a imagem: ela só traduz o que está no comando.
  • Substituições de comando, como $(id -u), não existem no Compose. O trecho é mantido como texto e sinalizado para você trocar pelo valor final.
  • Barras invertidas antes de letras, dígitos, ponto e sublinhado são preservadas para não quebrar caminhos do Windows (C:\dados). No bash, essa barra seria removida.
  • --gpus sai com driver: nvidia, o caso mais comum; ajuste se for outro.
  • Limites de E/S de disco (--device-read-bps, --blkio-weight…) não são convertidos: configure em blkio_config.
  • O resultado é um ponto de partida fiel ao comando. Recursos próprios do Compose, como depends_on e secrets, ficam por sua conta.

Perguntas frequentes

O arquivo deve se chamar docker-compose.yml ou compose.yaml? Os dois funcionam. A documentação do Docker indica compose.yaml como nome preferido e mantém docker-compose.yml por compatibilidade.

Preciso colocar version: "3.8" no início? Não. O campo é obsoleto na especificação atual e o Docker Compose avisa quando o encontra. Pode apagar também dos arquivos antigos.

É docker-compose ou docker compose? docker compose, com espaço, é o Compose V2, que vem como plugin do Docker. O docker-compose com hífen é o V1, que deixou de receber atualizações em 2023.

Posso converter vários contêineres de uma vez? Sim. Cole um comando por linha (ou separados por && ou ;). Cada um vira um serviço; se dois usarem a mesma imagem sem --name, o segundo recebe o sufixo -2.

Por que o command saiu como lista entre colchetes? Para manter os argumentos exatamente como o shell os separou. Em ["redis-server", "--appendonly", "yes"] não há risco de um argumento com espaços ser dividido de novo.

Minha senha está segura? A conversão roda só no navegador e nada é transmitido. Ainda assim, evite deixar senhas no compose.yaml versionado: prefira env_file ou variáveis no arquivo .env.

Ferramentas relacionadas