Cómo mostrar el comando de ejecución de un contenedor docker

102

Utilizo una GUI de terceros (paquete de Synology Docker) para configurar un contenedor de Docker. Sin embargo, su limitación me obliga a ejecutar el contenedor desde la línea de comandos. (Quiero mapear otra IP de host para vincular el puerto)

Ahora, dado que hay muchas configuraciones que ya están hechas, me gustaría recuperar el comando de ejecución original que inicia este contenedor, luego puedo cambiar el puerto de mapeo de puertos a uno nuevo. p.ej. " docker run -p 80:8080 gitlab"

No puedo encontrar la manera de hacerlo, uso del evento "Docker inspeccionar", no se proporciona dicha información.

Proporcione algunos consejos para resolver este problema.

Jack Yu
fuente
6
@capitalistpug esa pregunta es exactamente la opuesta a esta: se trata del comando dentro del contenedor, se trata del que se usa para iniciar el contenedor.
Niels Keurentjes
historia | grep 'docker run'
Adrian Mayo
1
Es sorprendente que Docker no tenga una opción incorporada para esto.
Macindows

Respuestas:

132

Entonces, ¿cómo hacer ingeniería inversa del comando Docker Run?

Hay un repositorio de github que intenta realizar la ingeniería inversa del comando docker run, pero actualmente no es perfecto, la versión sí lo es 0.1.2. Debe seguirlo para actualizar. Tal vez algún día pueda usarlo para obtener el comando de ejecución correcto con él.

$ 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

Repositorio de Github: runlike

Actualizaciones:

Ejecutar sin instalar (Gracias @tilo)

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

o establecer un alias

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

runlike YOUR-CONTAINER
BMW
fuente
1
Es un poco difícil de configurar en Synology DSM, pero lo intentaré. ¡Gracias!
Jack Yu
1
Tuve que usar sudo pip install runlike
Simon
@JackYu ¿Lograste instalarlo en Sysnology?
xedo
runlike nos ahorra mucho tiempo => ❤️
mtt2p
21
corre como:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo
30

Utilice Docker Inspect :

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

Puede analizar esto programáticamente con jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Chris Lamb
fuente
sí, también prefiero jq, un ligero ajuste en el comando (un poco más fácil de escribir y leer en mi humilde opinión) es: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll
1
"Cmd": null,¿Quizás esto solo funciona si el contenedor no se inició automáticamente como el demonio de la ventana acoplable?
Michael
23

Escribí una herramienta CLI simple basada en Node para generar un docker runcomando desde un contenedor existente.

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

He aquí un ejemplo:

$ 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"

También maneja enlaces y volúmenes montados y otras cosas.

No es muy robusto en este momento, pero maneja más que algunas de las otras cosas mencionadas, y era más de lo que estaba buscando.

EDITAR: En un solo comando, sin instalar ningún software:

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

Una alternativa más simple (?) Es ejecutar esta plantilla de inspección de la ventana acoplable , que utiliza las capacidades integradas de plantillas de Go para generar un docker runcomando compatible. La plantilla solo cubre las opciones de línea de comandos más habituales, pero se puede ampliar fácilmente.

Esta solución no depende de otras herramientas, excepto la propia ventana acoplable.

Emmanuel Frécon
fuente
5

Utilice el siguiente comando para obtener los argumentos de todos los contenedores. Docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)

Abhishek Jain
fuente
1
Esto enumera el comando y los argumentos de lo que se está ejecutando dentro del contenedor, no cómo se inició el contenedor (es decir, ¡la respuesta a la pregunta que publicó la respuesta de ejecución 4 minutos después de esto! :)).
OzgurH
4

Actualmente, parece que tenemos que ir a 'inspección de la ventana acoplable' y luego volver a crear manualmente el comando de ejecución.

He encontrado a alguien intentando escribir un script bash para hacer esto: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

pero está incompleto y depende de jq.

René Wooller
fuente
3

Lo que podría ser una opción más simple (robusta) sería usar algo como bash-preexec para capturar comandos que comienzan con "docker run". Luego, puede almacenar estos comandos en algún lugar y recuperarlos más tarde.

Por ejemplo, podría agregar algo como esto en su perfil de 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 $@
}

Entonces podrías ejecutar tus cosas:

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

Qué salidas:

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
cglacet
fuente
Interesante alternativa. +1
VonC
Es absurdo que Docker no registre el historial de comandos y tenga una canalización sencilla como esta.
Macindows
3

Si no desea instalar nada en la configuración actual del servidor Docker en ejecución, simplemente puede ejecutar (reemplazar $CONTAINER_NAMEcon el nombre del contenedor que desea tener los argumentos de ejecución):

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 el rekcodmétodo )

o

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 el runlikemétodo )

Anthony O.
fuente
2

Ese comando de ejecución de la ventana acoplable no se especifica en el Dockerfile ni en ningún otro documento relacionado con la ventana acoplable.

O encuentra un ejemplo en la documentación asociada a su contenedor, o puede inferir que la ventana acoplable se ejecuta con (al menos para el comando y el mapeo de puertos) a docker ps -a(pero eso no le dará el posible--volumes-from opciones )

Compruebe también /usr/syno/etc/packages/Docker-GitLab/config

Esto difiere de la propia configuración de gitlab, que en Synology está disponible en/usr/syno/etc/packages/Docker/synology_gitlab.config

VonC
fuente
Gracias por mencionar la ubicación del archivo de configuración de Synology Docker. Pero la configuración no puede ayudar mucho más. Su contenido es muy parecido al que exporta un contenedor desde la interfaz de usuario web.
Jack Yu
0

Todos los archivos de la ventana acoplable están aquí, puede encontrar cmd y montajes, por ejemplo, ls -la /proc/1 simplemente cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
usuario2319883
fuente