Ejecutar un script en Dockerfile

93

Estoy tratando de ejecutar un script durante mi proceso de construcción en mi Dockerfile. Pero no parece funcionar.

Lo intenté de esa manera:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

También de esta manera:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

Y también bu ejecutando mi contenedor en ejecución:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Nada parece funcionar.

¿Sabes como hacerlo?

Kevin
fuente
¿ bootstarp.shTiene el bit ejecutable configurado?
jwodder
¿Te gusta RUN chmod + x /bootstarp.sh?
Kevin
2
Con "no funciona", ¿qué está pasando exactamente? ¿Muestra algún error? ¿El archivo está presente dentro de la imagen? Si está docker exec -it symfony bashdentro del contenedor, ¿puede ejecutar manualmente el script y verificar su contenido? ( cat bootstarp.sh)?
thaJeztah
prueba esto: docker exec symfony /bin/bash /bootstarp.shy déjame saber el resultado.
Boynux
12
Ermahgerd bootstarp!
Bruno Bronosky

Respuestas:

128

RUNy ENTRYPOINTson dos formas diferentes de ejecutar un script.

RUNsignifica que crea un contenedor intermedio, ejecuta el script y congela el nuevo estado de ese contenedor en una nueva imagen intermedia. El script no se ejecutará después de eso: se supone que su imagen final refleja el resultado de ese script.

ENTRYPOINT significa que su imagen (que aún no ha ejecutado el script) creará un contenedor y ejecutará ese script.

En ambos casos, es necesario agregar el script y RUN chmod +x /bootstrap.shes una buena idea.

También debería comenzar con un shebang (como #!/bin/sh)

Teniendo en cuenta su secuencia de comandos ( bootstarp.sh: un par de git config --globalcomandos), sería mejor que RUNesa secuencia de comandos una vez en su Dockerfile, pero asegúrese de usar el usuario correcto (el git configarchivo global es %HOME%/.gitconfig, que por defecto es el /rootindicado)

Agregue a su Dockerfile:

RUN /bootstart.sh

Luego, cuando ejecute un contenedor, verifique el contenido de /root/.gitconfigpara confirmar que se ejecutó el script.

VonC
fuente
5
Además, es posible que haya querido decir en bootstrap.shlugar de bootstarp.sh: consulte stackoverflow.com/a/1254561/6309
VonC
¡Frio! Funciona muy bien con RUN /bootstrap.sh
Kevin
1
El shebang en la primera línea lo hizo por mí, ¡gracias! :)
GDICommander
34

Además de las respuestas anteriores:

Si creó / editó su archivo de secuencia de comandos .sh en Windows, asegúrese de que se haya guardado con el final de línea en formato Unix . De forma predeterminada, muchos editores de Windows convertirán los finales de línea de Unix al formato de Windows y Linux no reconocerá shebang (#! / Bin / sh) al principio del archivo. Entonces Linux producirá el mensaje de error como si no hubiera shebang.

Consejos:

  • Si usa Notepad ++, debe hacer clic en "Editar / Conversión EOL / UNIX (LF)"
  • Si usa Visual Studio, le sugiero que instale el complemento " End Of Line ". Luego, puede hacer visibles los finales de línea presionando Ctrl-R, Ctrl-W. Y para establecer finales de estilo Linux, puede presionar Ctrl-R, Ctrl-L. Para el estilo de Windows, presione Ctrl-R, Ctrl-C.
VeganHunter
fuente
4
Vaya, me salvaste el día. Gracias por esto.
mw
2
¡Brillante! este era mi problema EXACTO!
Kevinsyel
1
Mi VSCode había configurado automáticamente los finales alineados de un script de shell en CRLF en Windows. La compilación de la ventana acoplable estaba fallando debido a algunos caracteres aleatorios. Cambié la configuración en VS Code e inmediatamente comenzó a funcionar. ¡Gracias! He votado a favor.
Adithya Upadhya
24

Intente crear un script con el ADDcomando y la especificación del directorio de trabajo Así ("script" es el nombre del script y /root/script.shes donde lo quiere en el contenedor, puede ser una ruta diferente:

ADD script.sh /root/script.sh

En este caso ADDtiene que venir antes CMD, si tiene uno, por cierto, es una buena manera de importar scripts a cualquier ubicación en el contenedor desde la máquina host

En su CMDlugar[./script]

Debería ejecutar automáticamente su script

También puede especificar WORKDIRcomo /root, luego se le colocará automáticamente en la raíz, al iniciar un contenedor

Miguel
fuente
¿Cómo identifica Docker dónde está script.sh al principio? Es decir, el primer parámetro,script.sh
sunsets
ya que estás construyendo contenedores, también estás a cargo de colocar caminos
Michael
la ruta y el nombre del primer parámetro script.shes relativo alDockerfile
eja
4

Es una buena práctica usarlo en COPYlugar de ADDcuando está copiando desde el sistema de archivos local a la imagen. Además, recomendaría crear una subcarpeta para colocar su contenido. Al menos, mantiene las cosas ordenadas. Asegúrese de marcar el script como ejecutable usando chmod.

Aquí, estoy creando una scriptssubcarpeta para colocar mi script y ejecutarlo desde:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
ldobson
fuente