Estoy tratando de crear un script de shell para configurar un contenedor docker. Mi archivo de script se ve así:
#!bin/bash
docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash
La ejecución de este archivo de secuencia de comandos ejecutará el contenedor en un bash recién invocado.
Ahora necesito ejecutar un archivo de script (test.sh) que ya está dentro del contenedor del script de shell dado anteriormente (por ejemplo: cd /path/to/test.sh && ./test.sh) ¿Cómo hacer eso?
WORKDIR
yCMD
?Respuestas:
Puede ejecutar un comando en un contenedor en ejecución usando
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
:docker exec mycontainer /path/to/test.sh
Y para ejecutar desde una sesión bash:
docker exec -it mycontainer /bin/bash
Desde allí puede ejecutar su script.
fuente
docker exec -i mycontainer bash < mylocal.sh
Esto lee el script del host local y lo ejecuta dentro del contenedor. Puede hacer esto con otras cosas (como archivos .tgz canalizados en tar); solo usa el '-i' para canalizar la entrada estándar del proceso del contenedor.Get-Content mylocal.sh | docker exec -i mycontainer bash
. Aunque no sé si eso funciona.Suponiendo que su contenedor Docker esté en funcionamiento, puede ejecutar comandos como:
docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
fuente
/bin/sh -c "cmd1; cmd2; ...; cmdn"
) como el valor de una variable de shell? Lo pregunto porque 'docker run' parece esperar un solo comando y argumentos individuales sin comillas en lugar de una cadena entre comillas.cmd1
, necesito pasar un bucle for completo, pero se espera;
después de la declaración de bucle y la declaración do . ¿Cómo puedo ejecutar todo el bucle for como un solo comando, es decircmd1
? ¿Es posible?Estaba buscando una respuesta para esta misma pregunta y encontré ENTRYPOINT en la solución Dockerfile para mí.
Dockerfile
Ahora los scripts se ejecutan cuando inicio el contenedor y obtengo el indicador de bash después de que se han ejecutado los scripts.
fuente
También puede montar un directorio local en su imagen de docker y obtener el script en su
.bashrc
. No olvide que el script debe constar de funciones a menos que desee que se ejecute en cada shell nuevo. (Esto está desactualizado, consulte el aviso de actualización).Estoy usando esta solución para poder actualizar el script fuera de la instancia de Docker. De esta manera no tengo que volver a ejecutar la imagen si ocurren cambios, simplemente abro un nuevo shell. (Eliminó la reapertura de un shell, consulte el aviso de actualización)
Así es como enlaza su directorio actual:
docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
Ahora su directorio actual está vinculado a
/scripts
su instancia de Docker.(Desactualizado) Para guardar sus
.bashrc
cambios, confirme su imagen de trabajo con este comando:docker commit $container_id $my_docker_build
Actualizar
Para resolver el problema de abrir un nuevo shell para cada cambio, ahora hago lo siguiente:
En el propio dockerfile agrego
RUN echo "/scripts/bashrc" > /root/.bashrc"
. Dentrozshrc
exporto el directorio de scripts a la ruta. El directorio de scripts ahora contiene varios archivos en lugar de uno. Ahora puedo llamar directamente a todos los scripts sin tener que abrir un sub shell en cada cambio.Por cierto, también puede definir el archivo de historial fuera de su contenedor. De esta manera, ya no es necesario comprometerse con un cambio de bash.
fuente
En caso de que no desee (o tenga) un contenedor en ejecución, puede llamar a su script directamente con el
run
comando.Elimine los
-i -t
argumentos tty iterativos y use esto:Esto (no probado) también funcionará para otros scripts:
fuente
Eche un vistazo también a los puntos de entrada. Podrá utilizar múltiples CMD https://docs.docker.com/engine/reference/builder/#/entrypoint
fuente
Si desea ejecutar el mismo comando en varias instancias, puede hacer esto:
for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
fuente