docker - propia - Cómo mostrar el comando de ejecución de un contenedor acoplable
hacer contenedor docker (10)
Utilizo una GUI de terceros (paquete Synology Docker) para configurar un contenedor acoplable. Sin embargo, su limitación me hace necesitar ejecutar el contenedor desde la línea de comandos. (Quiero asignar otra ip de host para unir el puerto)
Ahora, dado que hay muchas configuraciones que ya se han realizado, me gustaría recuperar el comando de ejecución original que inicia este contenedor, luego puedo cambiar el puerto de asignación de puertos a uno nuevo.
p.ej.
"
docker run -p 80:8080 gitlab
"
No puedo encontrar la manera de hacerlo, el evento utiliza "docker inspeccionar", no se proporciona dicha información.
Por favor brinde algunos consejos para resolver este problema.
Entonces, ¿cómo invertir el comando Docker Run de ingeniería?
Hay un repositorio de github que intenta revertir el comando de ejecución de Docker de ingeniería, pero actualmente no es perfecto, la versión es
0.1.2
.
Debes seguirlo para actualizar.
Tal vez algún día pueda usarlo para obtener el comando de ejecución correcto.
$ 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
Actualmente parece que tenemos que ir a ''docker inspeccionar'' y luego recrear manualmente el comando de ejecución.
Encontré a alguien intentando escribir un script bash para hacer esto: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89
pero está incompleto y depende de jq.
Escribí una herramienta CLI simple basada en nodos para generar un comando de
docker run
desde un contenedor existente.
https://www.npmjs.com/package/rekcod
Aquí hay un ejemplo:
$ docker inspect foo/bar
[
{
# …
"Config": {
# …
"Cmd": [
"/usr/local/bin/script.sh"
],
# …
}
}
]
También maneja enlaces y volúmenes montados y otras cosas.
No es súper robusto por el 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 inspect foo/bar | jq -r ''.[0]["Config"]["Cmd"][0]''
/usr/local/bin/script.sh
Ese comando de ejecución de Docker no se especifica en el Dockerfile ni en ningún otro documento relacionado con Docker.
Puede encontrar un ejemplo en la documentación asociada a su contenedor, o puede inferir que la ventana acoplable se ejecuta con (al menos para el mapeo de comandos y puertos) una
docker ps -a
(pero eso no le dará los posibles
--volumes-from
opciones)
Compruebe también
/usr/syno/etc/packages/Docker-GitLab/config
Esto difiere de la
configuración de gitlab, que en Synology
está disponible en
/usr/syno/etc/packages/Docker/synology_gitlab.config
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 podría 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
Para invertir el comando docker run también existe el siguiente paquete npm.
Si no desea instalar nada en la configuración actual del servidor Docker en ejecución, simplemente puede ejecutar (reemplace
$CONTAINER_NAME
con el nombre del contenedor en el 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
método
rekcod
)
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
método
runlike
)
Una alternativa más simple (?) Es ejecutar
esta plantilla de inspección de acoplador
, que utiliza las capacidades integradas de creación de plantillas Go para generar un comando compatible de
docker run
.
La plantilla solo cubre las opciones de línea de comandos más habituales, pero puede ampliarse fácilmente.
Esta solución no tiene dependencias en otras herramientas, excepto en Docker.
Use docker inspeccionar :
$ 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"
Puede analizar esto programáticamente con jq :
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container
Utilice el siguiente comando para obtener los argumentos para todos los contenedores docker inspeccionar -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)