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?
docker
dockerfile
Kevin
fuente
fuente
bootstarp.sh
Tiene el bit ejecutable configurado?docker exec -it symfony bash
dentro del contenedor, ¿puede ejecutar manualmente el script y verificar su contenido? (cat bootstarp.sh
)?docker exec symfony /bin/bash /bootstarp.sh
y déjame saber el resultado.Respuestas:
RUN
yENTRYPOINT
son dos formas diferentes de ejecutar un script.RUN
significa 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.sh
es 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 degit config --global
comandos), sería mejor queRUN
esa secuencia de comandos una vez en suDockerfile
, pero asegúrese de usar el usuario correcto (elgit config
archivo global es%HOME%/.gitconfig
, que por defecto es el/root
indicado)Agregue a su Dockerfile:
Luego, cuando ejecute un contenedor, verifique el contenido de
/root/.gitconfig
para confirmar que se ejecutó el script.fuente
bootstrap.sh
lugar debootstarp.sh
: consulte stackoverflow.com/a/1254561/6309Ademá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:
fuente
Intente crear un script con el
ADD
comando y la especificación del directorio de trabajo Así ("script" es el nombre del script y/root/script.sh
es donde lo quiere en el contenedor, puede ser una ruta diferente:En este caso
ADD
tiene que venir antesCMD
, si tiene uno, por cierto, es una buena manera de importar scripts a cualquier ubicación en el contenedor desde la máquina hostEn su
CMD
lugar[./script]
Debería ejecutar automáticamente su script
También puede especificar
WORKDIR
como/root
, luego se le colocará automáticamente en la raíz, al iniciar un contenedorfuente
script.sh
script.sh
es relativo alDockerfile
Es una buena práctica usarlo en
COPY
lugar deADD
cuando 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 usandochmod
.Aquí, estoy creando una
scripts
subcarpeta para colocar mi script y ejecutarlo desde:fuente