¿Cómo puedo anular CMD cuando ejecuto una imagen acoplable?

123

Quiero inspeccionar una imagen acoplada creada por otra persona con un punto de entrada y un cmd especificado, por ejemplo:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Actualmente hago:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

¿Hay alguna forma de anular CMD para que esté vacío (para que no tenga que usar "--login")?

deformación
fuente

Respuestas:

126

Puede ingresar a través de docker run -it --entrypoint=/bin/bash $IMAGE -i(iniciará un nuevo contenedor desde la imagen y obtendrá un bash shell en modo interactivo), luego ejecute el comando de punto de entrada en ese contenedor.

Luego puede inspeccionar el contenedor en ejecución en el estado en que debería estar ejecutándose.

EDITAR: desde Docker 1.3 puede usar execpara ejecutar un proceso en un contenedor en ejecución. Inicie su contenedor como lo haría normalmente y luego ingréselo emitiendo:

docker exec -it $CONTAINER_ID /bin/bash

Suponiendo que bash esté instalado, se le dará acceso de shell al contenedor en ejecución.

Panagiotis Moustafellos
fuente
¿No ejecutaría eso "/ usr / sbin / apache2ctl / bin / bash"? (debido a que su ejemplo no anula el punto de entrada se utilizará el punto de entrada definido en el Dockerfile - o estoy perdiendo algo?)
urdimbre
¿Es eso algo que es diferente para las versiones de docker más antiguas / más nuevas quizás? Ciertamente ejecuta el punto de entrada para mí: gist.github.com/warpr/26a5cc471dce7fcf9021 . Esto está usando docker 0.10.0 en Ubuntu 13.10.
deformación
44
Sé que pasar --entrypoint anula el punto de entrada. Pero cuando uso --entrypoint, ¿cómo anulo CMD para que esté vacío? (Para bash, puedo usar algo como -i o --login, pero no todos los puntos de entrada que quiera usar tendrán un argumento "ficticio" equivalente).
deformación
1
Al menos en Docker v1.11.1 parece que anular el punto de entrada también evita la incorporación normal de la CMD al punto de entrada. Eso solo parece suceder cuando el punto de entrada no se anula.
Jasmine Hegman
1
¿Por qué hay un -idespués $IMAGE?
Eyal Levin el
27

Ver: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Porción relevante:

CMD (Comando u Opciones predeterminados) Recupere el COMANDO opcional en la línea de comandos de Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Este comando es opcional porque la persona que creó la IMAGEN ya puede haber proporcionado un COMANDO predeterminado utilizando Dockerfile CMD. Como operador (la persona que ejecuta un contenedor desde la imagen), puede anular esa CMD simplemente especificando un nuevo COMANDO.

Si la imagen también especifica un PUNTO DE ENTRADA, entonces el CMD o el COMANDO se agregan como argumentos al PUNTO DE ENTRADA.

Entonces, para hacer lo que desea, solo necesita especificar un cmd y anular el uso /bin/bash. No del todo "vacío", pero hace el trabajo al 99%.

Simon Thum
fuente
Vaya, pasé por alto un detalle. Excepto para acortar --logina -lsupongo que su solución ya es tan bueno como se pone.
Simon Thum
Aquí hay algo divertido que vi hoy: el comando no se anula, se adjunta. Aquí está el PS desde el interior del contenedor. Tenga en cuenta que el comando que agregué era echo "configurando el db" y el comando incorporado es / usr / bin / geth. También configuré el punto de entrada como "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
El enlace de referencia de Docker ya no funciona, no puedo encontrar un reemplazo obvio para él.
Chris Kimpton el
Simplemente lo arreglé, pero también me resultó difícil de encontrar; (
Simon Thum
15

Para cualquier persona que venga aquí para anular el punto de entrada Y el comando para pasar otro comando, por ejemplo, ejecutar bash en lugar del script de punto de entrada y luego ejecutar algún otro comando con parámetros (no estaba claro para mí en otras respuestas):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'es un parámetro para, /bin/shasí que aquí puede pasar cualquier comando que desee ejecutar en el contenedor. /bin/shes para imágenes alpinas, /bin/bashmuy probablemente para otras imágenes.

infro
fuente
1
solo los comandos de un shell de adición deben estar escritos en json, así que en lugar de citar con comillas simples, '...'use comillas dobles"..."
Jimmy Obonyo Abor
O simplemente pase tantos argumentos de entrada como desee
Nick Roz
esto no parece funcionar: "exec: \" - c \ ": archivo ejecutable no encontrado en $ PATH": desconocido.
Richard
Verifique la ruta en el contenedor, tal vez realmente no existe. La mayoría de las imágenes tienen, /bin/shpero la suya podría no ser ese el caso.
infro