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.



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

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

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

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.


5

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


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


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

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 )


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


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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.