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:
-
¿Mi script bash tiene una sintaxis incorrecta?
-
¿Cómo cambio el permiso de un archivo bash antes de agregarlo a una imagen?
-
¿Cuál es la mejor manera de ejecutar múltiples comandos git en el punto de entrada sin usar un script bash?
Gracias.
-
"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. -
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.
-
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.