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.
Cole um comando acima ou toque em um exemplo. A conversão é feita no seu navegador: nada é enviado.
Como usar
- Cole o comando completo, começando por
docker run(também valemdocker container run,docker create,podman runesudo docker run). - Comandos em várias linhas funcionam com
\no fim da linha (bash), crase (PowerShell) ou^(Prompt de Comando). - Confira os avisos abaixo do resultado: eles listam o que foi ignorado e o que merece revisão.
- Copie o YAML ou baixe o arquivo, salve como
compose.yamlna pasta do projeto e rodedocker 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 run | Compose |
|---|---|
--name | container_name (e nome do serviço) |
-p, --publish | ports |
-v, --volume, --mount | volumes (volumes nomeados também em volumes: no topo) |
-e, --env / --env-file | environment / env_file |
--restart | restart |
--network, --net | networks ou network_mode (host, none, bridge, container:nome) |
--network-alias, --ip | aliases e ipv4_address dentro da rede |
-h, -w, -u | hostname, working_dir, user |
--entrypoint / argumentos após a imagem | entrypoint / command |
-l, --add-host, --dns | labels, extra_hosts, dns |
--cap-add, --cap-drop, --privileged, --device | cap_add, cap_drop, privileged, devices |
--memory, --cpus | mem_limit, cpus (ou deploy.resources.limits) |
--shm-size, --ulimit, --sysctl, --tmpfs | shm_size, ulimits, sysctls, tmpfs |
--log-driver, --log-opt | logging.driver, logging.options |
--health-cmd, --health-interval… | healthcheck (test, interval, timeout, retries, start_period) |
--read-only, --init, -t, -i | read_only, init, tty, stdin_open |
--pid, --ipc, --security-opt, --platform | pid, ipc, security_opt, platform |
--stop-signal, --stop-timeout | stop_signal, stop_grace_period |
--expose, --link, --pull | expose, links, pull_policy |
--gpus | deploy.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:alpineservices:
site:
image: nginx:alpine
container_name: site
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:roO 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 downremove os contêineres; para tarefas avulsas, usedocker 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. --gpussai comdriver: 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 emblkio_config. - O resultado é um ponto de partida fiel ao comando. Recursos próprios do Compose, como
depends_onesecrets, 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
- Gerador de Cron — monte expressões de agendamento para tarefas em contêineres.
- Calculadora de Chmod — permissões de arquivos montados em volumes.
- Calculadora CIDR — planeje a sub-rede das suas redes Docker.
- Gerador de Porta Aleatória — escolha uma porta livre para publicar.
- Gerador de Senha — crie senhas fortes para bancos de dados.
- Formatador de JSON — organize arquivos de configuração em JSON.