BrowserTools
Início / Conversores / Docker run para Compose

Docker run para Compose

Transforma um comando docker run num ficheiro docker-compose.yml pronto a usar.

A carregar Docker run para Compose… Se nada acontecer, ativa o JavaScript.

A maioria dos projetos começa com uma linha docker run copiada de um README e acaba numa parede de opções que ninguém quer voltar a escrever. Cola esse comando aqui e esta ferramenta reescreve-o como um ficheiro docker-compose.yml, associando cada opção reconhecida à chave correspondente do Compose: -p passa a ports, -v passa a volumes, -e passa a environment, --restart passa a restart, e assim por diante para cerca de setenta opções, incluindo healthchecks, limites de recursos, controladores de registo, capacidades, ulimits e reservas de GPU.

Perguntas frequentes

O meu comando docker run é enviado para algum servidor?
Não. O analisador e o gerador de YAML são JavaScript puro a correr no teu navegador, e a página não faz qualquer pedido de rede durante a conversão. Os comandos contêm muitas vezes senhas, tokens ou nomes de registos privados, por isso isto importa: podes colar um comando de produção e nada é enviado, registado ou guardado.
Que opções do docker run são suportadas?
Cerca de setenta, incluindo as mais comuns (--name, -p, -v, -e, --restart, --network, -w, -u, --entrypoint, --hostname), os limites de recursos (--memory, --cpus, --pids-limit, --shm-size, --ulimit), as opções de segurança (--cap-add, --cap-drop, --security-opt, --privileged, --read-only), a família do healthcheck, --log-driver com --log-opt, --mount, --tmpfs, --sysctl, --device e --gpus. A lista completa está na tabela de referência da página, e tudo o que não for reconhecido aparece nas Notas em vez de desaparecer em silêncio.
Porque é que o -d não aparece no ficheiro gerado?
Correr em segundo plano não é uma propriedade do serviço, é a forma como o arrancas. O Compose coloca tudo em segundo plano quando usas docker compose up -d, por isso a opção não tem chave no ficheiro. O mesmo se aplica ao --rm, que corresponde a docker compose down, e às opções de ligação ao terminal como -a e --detach-keys.
Preciso da chave version no topo do ficheiro?
Não, e é por isso que está desligada por omissão. A Compose Specification eliminou-a, e as versões recentes do Docker Compose mostram um aviso quando a encontram. Liga a opção só se ainda usares o antigo docker-compose v1 em Python, esse sim espera um campo version.
O que acontece aos volumes e às redes com nome?
Uma montagem cuja origem não é um caminho, como -v pgdata:/var/lib/postgresql/data, é um volume com nome, por isso pgdata é acrescentado à secção volumes de topo. As redes com nome passadas em --network são acrescentadas à secção networks marcadas como external, partindo do princípio de que já existem por causa do teu docker network create. Remove o external: true se preferires que seja o Compose a criá-las com o projeto.
Posso converter mais do que um contentor de uma vez?
Sim. Cola vários comandos docker run, um por linha ou encadeados com && ou ;, e cada um passa a ser um serviço. O nome do serviço vem do --name quando existe, caso contrário do nome da imagem, e os repetidos recebem um sufixo numérico. É a forma mais rápida de transformar um script de arranque de uma aplicação e da sua base de dados num único ficheiro Compose.
Porque é que os mapeamentos de portas ficam entre aspas?
Porque em YAML 1.1 um 22:22 sem aspas é lido como um número sexagesimal, a armadilha clássica de quem começa no Compose. As aspas mantêm o valor como texto e o mapeamento intacto. Os restantes valores só levam aspas quando precisam, para o resultado continuar legível.
A ferramenta percebe --mount e healthchecks?
Sim. Uma especificação --mount é reescrita na sintaxe longa de volume com type, source, target e read_only, que é o que o Compose espera para montagens bind e tmpfs. As opções --health-cmd, --health-interval, --health-timeout, --health-retries e --health-start-period são reunidas num bloco healthcheck, com o comando envolvido em CMD-SHELL a não ser que já comece por CMD.
Como corro o ficheiro depois de gerado?
Guarda-o como docker-compose.yml (o botão de descarregar faz isso por ti), abre um terminal na mesma pasta e corre docker compose up -d. Verifica-o primeiro com docker compose config, que valida o ficheiro e o imprime com tudo resolvido. Lê a secção de Notas desta página antes de correr fosse o que fosse em produção, porque há opções sem equivalente que podem exigir uma decisão manual.

Sobre Docker run para Compose

O conversor lê o comando como a linha de comandos o leria. Continuações de linha com barra invertida, aspas simples e duplas, opções curtas com o valor colado como -p8080:80, opções agrupadas como -itd e a forma --opcao=valor são todas tratadas, por isso podes colar um comando tal como aparece na documentação, sem o limpar primeiro. Cola vários comandos, um por linha ou ligados com &&, e cada um torna-se um serviço no mesmo ficheiro. Os volumes e as redes com nome usados por esses serviços são recolhidos e declarados nas secções volumes e networks de topo, e as portas ficam entre aspas para que um valor como 22:22 não seja lido como um número sexagesimal pelo interpretador de YAML.

As opções que só fazem sentido no momento do arranque não têm lugar num ficheiro Compose, e a ferramenta diz-te isso em vez de as descartar em silêncio: -d é substituído por docker compose up -d, --rm por docker compose down, e opções como --cidfile ou --detach-keys aparecem nas Notas com uma explicação curta. Tudo corre no teu navegador, sem chamadas ao servidor e sem bibliotecas externas, por isso comandos com senhas, nomes de registos privados ou nomes internos de imagens nunca saem da página. Copia o resultado ou descarrega-o como docker-compose.yml e corre docker compose up -d na mesma pasta.

O Compose começou por se chamar Fig

Antes do Docker Compose existiu o Fig, uma pequena ferramenta em Python lançada em 2013 pela Orchard Laboratories. O Fig trouxe a ideia de que uma aplicação com vários contentores devia ser descrita num único ficheiro YAML e arrancada com um só comando, numa altura em que o costume era um script de shell cheio de linhas docker run. A Docker comprou a Orchard em 2014 e o Fig passou a docker-compose no ano seguinte, mantendo o formato do ficheiro quase inalterado.

O formato passou depois por uma década de mudanças. A versão 1 não tinha sequer chaves de topo, a versão 2 acrescentou services, volumes e networks, e a versão 3 foi moldada pelo Docker Swarm, razão pela qual chaves como deploy ainda aparecem em ficheiros que nunca verão um swarm. A numeração terminou com a Compose Specification, que juntou os ramos 2 e 3 e tornou o campo version obsoleto.

A reescrita de Python para Go no Compose V2 mudou também a forma de o invocar: docker-compose com hífen passou a docker compose, um subcomando do CLI do Docker. O binário autónomo antigo chegou ao fim de vida em julho de 2023, por isso se um tutorial ainda te disser para acrescentar version: '3.8' no topo do ficheiro, foi escrito para uma ferramenta que a Docker já não distribui.

Apoiar