Como mostrar o comando de execução de um contêiner docker


102

Eu uso uma GUI de terceiros (pacote Synology Docker) para configurar um contêiner docker. No entanto, sua limitação me faz precisar executar o contêiner a partir da linha de comando. (Eu quero mapear outro ip de host para ligar a porta)

Agora, como já existem várias configurações feitas, gostaria de recuperar o comando run original que inicia este contêiner, então posso alterar a porta de mapeamento de porta para uma nova. por exemplo. " docker run -p 80:8080 gitlab"

Não consigo encontrar uma maneira de fazer isso, evento use "docker inspect", nenhuma informação fornecida.

Forneça alguns conselhos para resolver este problema.



6
@capitalistpug essa pergunta é exatamente o oposto desta - é sobre o comando dentro do contêiner, é sobre aquele usado para iniciar o contêiner.
Niels Keurentjes

história | grep 'docker run'
Adrian maio

1
É incrível que o Docker não tenha uma opção embutida para isso.
Macindows

Respostas:


132

Então, como fazer a engenharia reversa do comando docker run?

Há um repositório github que tenta fazer engenharia reversa do comando docker run, mas não é perfeito atualmente, a versão é 0.1.2. Você deve segui-lo para atualização. Talvez um dia você possa usá-lo para obter o comando de execução correto com ele.

$ sudo pip install runlike

# run the ubuntu image
$ docker run -ti ubuntu bash

$ docker ps -a  
# suppose you get the container ID 1dfff2ba0226

# Run runlike to get the docker run command. 
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash

Repositório Github: runlike

Atualizações:

Execute sem instalar (Obrigado @tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

ou definir alias

alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock 
 assaflavie/runlike"

runlike YOUR-CONTAINER

1
É um pouco difícil configurar runlike em Synology DSM, mas vou tentar. Obrigado!
Jack Yu

1
Tive que usar sudo pip install runlike
Simon

@JackYu você conseguiu instalá-lo no Sysnology?
xedo

runlike nos economiza muito tempo => ❤️
mtt2p

21
correr como:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo

30

Use docker inspect :

$ docker inspect foo/bar
[
    {
        # …
        "Config": {
            # …
            "Cmd": [
                "/usr/local/bin/script.sh"
            ],
            # …
        }
    }
]

Você pode analisar isso programaticamente com jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh

sim, eu prefiro jq também, um pequeno ajuste no comando (um pouco mais fácil de digitar e ler IMHO) é: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll

1
"Cmd": null,Talvez isso funcione apenas se o contêiner não foi iniciado automaticamente pelo daemon do docker?
Michael

23

Eu escrevi uma ferramenta CLI simples baseada em nó para gerar um docker runcomando de um contêiner existente.

https://www.npmjs.com/package/rekcod

Aqui está um exemplo:

$ npm i -g rekcod
$ rekcod redis_container

docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"

Também lida com links e volumes montados e outras coisas.

Não é super robusto no momento, mas lida com mais do que algumas das outras coisas mencionadas, e era mais do que eu estava procurando.

EDIT: Em um único comando, sem instalar nenhum software:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container

6

Uma alternativa mais simples (?) É executar este modelo de inspeção do docker , que usa os recursos integrados de modelos Go para gerar um docker runcomando compatível. O modelo cobre apenas as opções de linha de comando mais comuns, mas pode ser facilmente estendido.

Esta solução não depende de outras ferramentas, exceto do próprio docker.


5

Use o seguinte comando para obter os argumentos de todos os contêineres docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
Isso lista o comando e os argumentos para o que está sendo executado dentro do contêiner, não como o contêiner foi iniciado (ou seja, a resposta à pergunta que você postou, a resposta runlike 4 minutos depois disso! :)).
OzgurH


3

O que poderia ser uma opção mais simples (robusta) seria usar algo como bash-preexec para capturar comandos que começam com "docker run". Você pode então armazenar esses comandos em algum lugar e recuperá-los mais tarde.

Por exemplo, você pode adicionar algo assim em seu perfil bash:

[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
docker_run_history=~/.docker_run_history
docker_clear_history(){
    echo -n > $docker_run_history
}
docker_search_history(){
    search_for="$@"
    [[ -z $search_for ]] && search_for=".*"
    \cat $docker_run_history | grep "$search_for" | tail -1
}
docker_ps_mod(){
    for c in $(docker ps --format "{{.Image}}"); do 
        echo "Container $c was run using:"
        echo -e "\t$(docker_search_history $c)"
    done
}
docker_hook(){
    if [[ $@ =~ ^"docker run".*$ ]]; then
        \echo "$@" >> $docker_run_history 
    fi
}
preexec(){ 
    docker_hook $@
}

Então você pode simplesmente executar suas coisas:

source ~/.bash_profile
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
docker run -d daemon
docker_ps_mod

Quais saídas:

Container image was run using:
    docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
Container daemon was run using:
    docker run -d daemon

Alternativa interessante. +1
VonC

É um absurdo que o docker não registre o histórico de comandos e tenha uma tubulação simplesmente como esta.
Macindows

3

Se não quiser instalar nada na configuração do servidor Docker em execução, você pode simplesmente executar (substitua $CONTAINER_NAMEpelo nome do contêiner que deseja que tenha os argumentos run):

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"

(para o rekcodmétodo )

ou

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"

(para o runlikemétodo )


2

Esse comando docker run não é especificado no Dockerfile ou em qualquer outro documento relacionado ao docker.

Você encontra um exemplo na documentação associada ao seu contêiner ou pode inferir que o docker é executado com (pelo menos para o comando e mapeamento de porta) a docker ps -a(mas isso não fornecerá as --volumes-fromopções possíveis )

Verifique também /usr/syno/etc/packages/Docker-GitLab/config

Isso difere da própria configuração do gitlab, que na Synology está disponível em/usr/syno/etc/packages/Docker/synology_gitlab.config


Obrigado por mencionar a localização do arquivo de configuração do Synology Docker. Mas a configuração não pode ajudar muito mais. Seu conteúdo é praticamente o mesmo que você exporta um contêiner da IU da web.
Jack Yu


0

Todos os arquivos do docker estão aqui, você pode encontrar cmd e montagens por exemplo ls -la /proc/1 apenas cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.