Soy nuevo en el mundo de los acopladores. Tengo que invocar un script de shell que toma argumentos de línea de comando a través de un contenedor acoplable. Ej: Mi script de shell se ve así:
#!bin/bash
echo $1
Dockerfile se ve así:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
No estoy seguro de cómo pasar los argumentos mientras ejecuto el contenedor
bash
shell
docker
command-line-arguments
Akash Mehta
fuente
fuente
docker run -ti test /file.sh abc
? Siento que el script no se ejecutará porque debería serlodocker run -ti test sh /file.sh abc
. sh o / bin / sh lo ejecutarán correctamente.con este script en
file.sh
y esto
Dockerfile
deberias ser capaz de:
fuente
ENTRYPOINT ./file.sh
chmod +x file.sh
configurar la bandera ejecutable.["/file.sh"]
e/file.sh
incluso[/file.sh]
Con Docker, la forma correcta de pasar este tipo de información es a través de variables de entorno.
Entonces, con el mismo Dockerfile, cambie el script a
Después de compilar, use el siguiente comando docker:
fuente
Hay algunas cosas que interactúan aquí:
docker run your_image arg1 arg2
reemplazará el valor deCMD
conarg1 arg2
. Eso es un reemplazo completo de la CMD, sin agregarle más valores. Es por eso que a menudo vesdocker run some_image /bin/bash
ejecutar un shell bash en el contenedor.Cuando tiene definidos un ENTRYPOINT y un valor CMD, Docker inicia el contenedor concatenando los dos y ejecutando ese comando concatenado. Entonces, si define su punto de entrada para que sea
file.sh
, ahora puede ejecutar el contenedor con argumentos adicionales que se pasarán como argumentos afile.sh
.Los puntos de entrada y los comandos en la ventana acoplable tienen dos sintaxis, una sintaxis de cadena que lanzará un shell y una sintaxis json que realizará un exec. El shell es útil para manejar cosas como la redirección de E / S, encadenando múltiples comandos juntos (con cosas como
&&
), sustitución de variables, etc. Sin embargo, ese shell se interpone en el manejo de la señal (si alguna vez ha visto un retraso de 10 segundos para detenerse). un contenedor, esta suele ser la causa) y con la concatenación de un punto de entrada y comando juntos. Si define su punto de entrada como una cadena, se ejecutará/bin/sh -c "file.sh"
, lo que solo está bien. Pero si también tiene un comando definido como una cadena, verá algo así/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
como el comando que se inicia dentro de su contenedor, no tan bueno. Consulte la tabla aquí para obtener más información sobre cómo interactúan estas dos opciones.La
-c
opción de shell solo toma un único argumento. Todo después de eso se pasaría como$1
,$2
etc., a ese único argumento, pero no a un script de shell incrustado a menos que haya pasado explícitamente los argumentos. Es decir/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
, funcionaría, pero/bin/sh -c "file.sh" "arg1" "arg2"
no lofile.sh
haría, ya que se llamaría sin argumentos.En conjunto, el diseño común es:
Y luego ejecutas eso con:
Hay bastante más detalles sobre esto en:
fuente
["bash", "--login", "-c"]
para obtener la fuente / etc / profile en la imagen, pero luego me pregunté por qué no se pasarían argumentos a un script de shell para ejecutar Docker ... Su respuesta se aclaró, gracias !Lo que tengo es un archivo de script que realmente ejecuta cosas. Este archivo de script puede ser relativamente complicado. Llamémoslo "run_container". Este script toma argumentos de la línea de comando:
Un simple run_container podría ser:
Lo que quiero hacer es, después de "acoplar" esto, me gustaría poder iniciar este contenedor con los parámetros en la línea de comando del acoplador como este:
y que el script run_container se ejecute con p1 p2 p3 como parámetros.
Esta es mi solución:
Dockerfile:
fuente
ENTRYPOINT
matriz con"/run_container \"$@\""
medios significa que los argumentos que contienen espacios se manejan correctamente (por ejemplodocker run image_name foo 'bar baz' quux
).Si quieres ejecutarlo @build time:
si quieres ejecutarlo @ tiempo de ejecución:
Luego en el host shell
fuente
ENTRYPOINT
es una buena respuesta para el OP que creo que quería tiempo de ejecución, pero si realmente desea variables de tiempo de compilación, esta respuesta simplemente no funciona. UseARG
ydocker build --build-arg
docs.docker.com/engine/reference/builder/#argOtra opción...
Para que esto funcione
en dockerfile
en entrypoint.sh
fuente