• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

600
Views
'docker run' ignora el primer comando agregado a ENTRYPOINT ["/bin/bash", "-c", ". foo.sh"] pero no ["bash", "foo.sh"]

Estoy tratando de ejecutar una imagen acoplable que ejecuta un script bash y pasa argumentos en tiempo de ejecución a ese script bash. Descubrí que cuando construyo la imagen usando el punto de entrada recomendado ENTRYPOINT ["/bin/bash", "-c", ". foo.sh"] , el primer argumento agregado al comando de docker run no se selecciona por mi script, pero cuando construyo la imagen con ENTRYPOINT ["bash", "foo.sh"] , lo hace.

Una versión de juguete del script de shell se ve así:

 #!/bin/bash echo you got "$#" args ARG1=${1:-foo} ARG2=${2:-bar} ARG3=${3:-1} ARG4=${4:-$(date)} echo "$ARG1" echo "$ARG2" echo "$ARG3" echo "$ARG4"

así que, básicamente, el script espera hasta 4 argumentos de línea de comando, cada uno con valores predeterminados.

El Dockerfile original que probé se ve así:

 FROM ubuntu COPY foo.sh foo.sh ENTRYPOINT ["/bin/bash", "-c", ". foo.sh"]

y se basó en una serie de recursos que encontré sobre cómo ejecutar correctamente un script de shell usando la forma exec de ENTRYPOINT recomendada por docker .

Después de construir esta imagen con docker build -t foo . , lo ejecuto con docker run -it foo first second third fourth y obtengo el siguiente resultado:

 you got 3 args second third fourth Tue Jul 2 13:14:52 UTC 2019

claramente, el primer argumento agregado al comando de docker run se coloca en algún lugar a lo largo de la línea, y los únicos argumentos que el comando de shell ingiere son el segundo, el tercero y el cuarto.

Pasé mucho tiempo tratando de diagnosticar el problema y hasta ahora no he descubierto por qué sucede esto. Lo mejor que se me ocurrió es una solución un poco complicada, después de descubrir que cambiar el punto de entrada a simplemente ENTRYPOINT ["bash", "pilates.sh"] produce los resultados deseados.

Me encantaría saber lo siguiente: 1. ¿Por qué el punto de entrada original descarta el primer argumento en tiempo de ejecución? 2. ¿Por qué el segundo punto de entrada funciona de manera diferente al primero?

about 3 years ago · Santiago Trujillo
2 answers
Answer question

0

Cuando ejecuta bash -c 'something' foo bar baz , "foo" se convierte en el parámetro cero (es decir, $0 )

Necesita insertar un parámetro ficticio allí, tal vez

 ENTRYPOINT ["/bin/bash", "-c", ". foo.sh", "bash"]

Esto está documentado en la página man de bash, en la descripción de la opción -c .

about 3 years ago · Santiago Trujillo Report

0

Un contenedor Docker ejecuta un solo proceso, especificado en su caso por la configuración ENTRYPOINT; cuando ese proceso sale, el contenedor sale. Aquí, esto significa que no hay un entorno de shell circundante que deba actualizar, por lo que no es necesario ejecutar su secuencia de comandos usando el archivo . incorporado; y una vez que solo está ejecutando un comando simple, tampoco hay necesidad de envolver su comando en un contenedor sh -c .

Eso produce un Dockerfile como

 FROM ubuntu COPY foo.sh foo.sh RUN chmod +x foo.sh # if it's not executable already ENTRYPOINT ["./foo.sh"]

Esto también evita el problema con sh -c consumiendo su primer argumento anotado en la respuesta de @GlennJackman.

about 3 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 Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error