Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

666
Views
¿Cómo obtener un script de punto de entrada con Docker?

Tengo una imagen de Docker y puedo ejecutarla:

 docker run -it --entrypoint="/bin/bash" gcr.io/docker:tag

Entonces puedo obtener un script de la siguiente manera:

 root@86bfac2f6ccc:/# source entrypoint.sh

El 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 directory

Pero 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 directory

O 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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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.)

over 4 years ago · Santiago Trujillo Report

0

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 .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!