start script run hub entrypoint container compose attach bash shell docker

bash - script - docker start container



El punto de entrada de Docker que ejecuta el script bash obtiene "permiso denegado" (5)

Estoy tratando de dockerizar mi aplicación node.js. Cuando se construye el contenedor, quiero que ejecute un git clone y luego inicie el servidor de nodo. Por lo tanto, pongo estas operaciones en un script .sh. Y ejecute el script como un solo comando en el ENTRYPOINT:

FROM ubuntu:14.04 RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git #install gcc 4.9 RUN apt-get install -y software-properties-common python-software-properties RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test RUN apt-get update RUN apt-get install -y libstdc++-4.9-dev #install newst nodejs RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - RUN apt-get install -y nodejs RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ADD package.json /usr/src/app/ RUN npm install ADD docker-entrypoint.sh /usr/src/app/ EXPOSE 8080 ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]

Mi docker-entrypoint.sh se ve así:

git clone git@<repo>.git git add remote upstream git@<upstream_repo>.git /usr/bin/node server.js

Después de construir esta imagen y ejecutar:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

Me estoy poniendo:

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

Me meto en el contenedor y el permiso de docker-entrypoint.sh es:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

tres preguntas:

  1. ¿Mi script bash tiene una sintaxis incorrecta?

  2. ¿Cómo cambio el permiso de un archivo bash antes de agregarlo a una imagen?

  3. ¿Cuál es la mejor manera de ejecutar múltiples comandos git en el punto de entrada sin usar un script bash?

Gracias.


  1. "Permiso denegado" evita que se invoque su script. Por lo tanto, la única sintaxis que podría ser pertinente es la de la primera línea (el "shebang"), que debería verse como #!/usr/bin/env bash , o #!/bin/bash , o similar, dependiendo de su diseño del sistema de archivos del objetivo.

  2. Lo más probable es que los permisos del sistema de archivos no se configuren para permitir la ejecución. También es posible que el shebang haga referencia a algo que no es ejecutable, pero esto es mucho menos probable.

  3. Provocado por la facilidad de reparar los problemas anteriores.

La simple lectura de

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

... es que el script no está marcado como ejecutable.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

abordará esto dentro del contenedor. Alternativamente, puede asegurarse de que la copia local a la que hace referencia el Dockerfile es ejecutable , y luego usar COPY (que está explícitamente documentado para retener metadatos).


Esta es una vieja pregunta que se hizo dos años antes de mi respuesta, de todos modos voy a publicar lo que funcionó para mí.

En mi directorio de trabajo tengo dos archivos: Dockerfile y provision.sh

Dockerfile:

FROM centos:6.8 # put the script in the /root directory of the container COPY provision.sh /root # execute the script inside the container RUN /root/provision.sh EXPOSE 80 # Default command CMD ["/bin/bash"]

provision.sh:

#!/usr/bin/env bash yum upgrade

Pude hacer que el archivo en el contenedor docker fuera ejecutable estableciendo el archivo fuera del contenedor como ejecutable chmod 700 provision.sh luego ejecutando docker build . .


Me enfrenté al mismo problema y se resolvió por

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

Para el Dockerfile en la pregunta original, debería ser como:

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]


Si no usa DockerFile, simplemente puede agregar permiso como argumento de línea de comando de bash:

docker run -t <image> /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"


Un archivo ejecutable debe tener permisos de ejecución establecidos antes de poder ejecutarlo.

En su máquina donde está construyendo la imagen del acoplador (no dentro de la imagen del acoplador), intente ejecutar:

ls -la path/to/directory

La primera columna de la salida para su ejecutable (en este caso docker-entrypoint.sh) debe tener los bits ejecutables establecidos de la siguiente manera:

-rwxrwxr-x

Si no, entonces intente:

chmod +x docker-entrypoint.sh

y luego construye tu imagen de docker nuevamente.

Docker utiliza su propio sistema de archivos, pero copia todo (incluidos los bits de permisos) de los directorios de origen.