Tengo una imagen de Docker y puedo ejecutarla:
docker run -it --entrypoint="/bin/bash" gcr.io/docker:tagEntonces puedo obtener un script de la siguiente manera:
root@86bfac2f6ccc:/# source entrypoint.shEl guión se ve así:
more entrypoint.sh #!/bin/bash . /env.sh . /root/miniconda3/etc/profile.d/conda.sh conda activate base exec "$@"Que activan la base env:
(base) root@86bfac2f6ccc:/# Hasta ahora todo bien, pero no logré incluir esto en Dockerfile o como parámetros para docker run Docker:
Intenté muchas cosas:
Por ejemplo:
docker run -it --entrypoint="/bin/bash" gcr.io/docker:tag source entrypoint.sh /bin/bash: source: No such file or directoryPero el script existe y se puede ejecutar:
docker run -it --entrypoint="/bin/ls" gcr.io/docker:tag -la ... -rwxr-xr-x 1 root root 94 Apr 26 20:36 entrypoint.sh ...O:
docker run -it --entrypoint="/bin/bash" gcr.io/docker:tag ". /entrypoint.sh" /bin/bash: . /entrypoint.sh: No such file or directoryO en el archivo Docker:
ENTRYPOINT ["source", "/entrypoint.sh"] Supongo que el problema que tengo tal vez esté relacionado con el hecho de que la source evalúa un script en el shell actual.
¿Alguna guía para lograr lo que quiero? Parece bastante obvio, pero estoy fuera de la idea.
Cuando Docker lanza un contenedor, hay dos partes, el "punto de entrada" y el "comando". Cuando se especifican ambos, la parte de "comando" se pasa como argumentos de línea de comando a la parte de "punto de entrada".
En particular, el script que muestra tiene un patrón muy típico para un script de punto de entrada:
#!/bin/sh # ... do some setup ... # then run the CMD passed as command-line arguments exec "$@" Si su Dockerfile nombra este script como su ENTRYPOINT , entonces desea pasar el comando que desea ejecutar como la parte de "comando". Si ejecuta su shell como solo
docker run --rm -it gcr.io/docker:tag sh luego sh se pasará al script de punto de entrada, que hará la configuración y luego lo ejecutará.
(Recuerde que la source es una extensión específica del proveedor y no existe en muchos shells, como el shell mínimo BusyBox que usan las imágenes base de Alpine, pero . significa lo mismo y está en el estándar POSIX. Dado que un contenedor solo ejecuta uno proceso, tampoco tiene sentido que ese proceso sea "fuente de este archivo”; configuraría algunas variables de entorno, y luego se hace para que el contenedor salga. El patrón de punto de entrada hace la configuración y luego ejecuta el contenedor principal dominio.)
En un shell interactivo, la source le dice al shell que lea los comandos del archivo sin crear un subshell. En su caso, desea que el shell inicial ejecute los comandos desde un script. Así que todo lo que tienes que hacer es dar el guión como argumento. Prueba lo siguiente:
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] Sin embargo, no es una buena idea ejecutar un shell como proceso inicial en un contenedor. Eso arruina el manejo de la señal. Notará que no puede detener la ejecución con Ctrl-C. Por lo tanto, use CMD en lugar de ENTRYPOINT para iniciar el shell. El proceso inicial con id 1 debe ser un proceso de inicio mínimo, como tini .