Tengo un contenedor con nodejs y pm2 como comando de inicio y en OpenShift recibo este error al iniciar:
Error: EACCES: permiso denegado, mkdir '/.pm2'
Probé la misma imagen en un hoster de Marathon y funcionó bien.
¿Necesito cambiar algo con UserIds?
El Dockerfile:
FROM node:7.4-alpine RUN npm install --global yarn pm2 RUN mkdir /src COPY . /src WORKDIR /src RUN yarn install --production EXPOSE 8100 CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"] Actualizar
la imagen del nodo ya crea un nuevo "nodo" de usuario con UID 1000 para no ejecutar la imagen como root.
También traté de corregir los permisos y agregar el "nodo" del usuario al grupo raíz.
Además, le dije a pm2 qué directorio debería usar con ENV var:
PM2_HOME=/inicio/nodo/aplicación/.pm2
Pero sigo recibiendo el error:
Error: EACCES: permission denied, mkdir '/home/node/app/.pm2'Dockerfile actualizado:
FROM node:7.4-alpine RUN npm install --global yarn pm2 RUN adduser node root COPY . /home/node/app WORKDIR /home/node/app RUN chmod -R 755 /home/node/app RUN chown -R node:node /home/node/app RUN yarn install --production EXPOSE 8100 USER 1000 CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]Update2 gracias a Graham Dumpleton lo hice funcionar
FROM node:7.4-alpine RUN npm install --global yarn pm2 RUN adduser node root COPY . /home/node/app WORKDIR /home/node/app RUN yarn install --production RUN chmod -R 775 /home/node/app RUN chown -R node:root /home/node/app EXPOSE 8100 USER 1000 CMD ["pm2-docker", "start", "--auto-exit", "--env", "production", "process.yml"]OpenShift ejecutará contenedores de forma predeterminada como un usuario no raíz. Como resultado, su aplicación puede fallar si requiere que se ejecute como root. Si puede configurar su contenedor para que se ejecute como root dependerá de los permisos que tenga en el clúster.
Es mejor diseñar su contenedor y aplicación para que no tenga que ejecutarse como root.
Algunas sugerencias.
Cree un usuario UNIX especial para ejecutar la aplicación y configure ese usuario (usando su uid), en la instrucción USER del Dockerfile . Haga que el grupo para el usuario sea el grupo raíz.
Permisos de reparación en el directorio /src y todo lo que se encuentra debajo de él, de modo que sea propiedad del usuario especial. Asegúrese de que todo sea raíz del grupo. Asegúrese de que cualquier cosa que necesite ser escribible sea escribible en la raíz del grupo.
Asegúrese de establecer HOME en /src en Dockerfile .
Una vez hecho esto, cuando OpenShift ejecuta su contenedor como un uid asignado, donde el grupo es raíz, entonces, en virtud de que todo se puede escribir en grupo, la aplicación aún puede actualizar los archivos en /src . La variable HOME que se establece garantiza que todo lo que se escriba en el directorio de inicio mediante código vaya al área de escritura /src .
También puede ejecutar el siguiente comando que otorga acceso de root al proyecto en el que inició sesión:
oc adm policy add-scc-to-user anyuid -z default
La solución de Graham Dumpleton funciona pero no se recomienda.
Openshift utilizará UID aleatorios al ejecutar contenedores.
Puede ver eso en el Yaml generado de su Pod.
spec: - resources: securityContext: runAsUser: 1005120000En su lugar, debe aplicar las mejores prácticas de seguridad de Docker para escribir su Dockerfile.
No vincule la ejecución de su aplicación a un UID específico: haga que los recursos sean legibles (es decir, 0644 en lugar de 0640) y ejecutables cuando sea necesario.
Hacer ejecutables propiedad de root y no escribibles
Para obtener una lista completa de recomendaciones, consulte: https://sysdig.com/blog/dockerfile-best-practices/
En su caso, no es necesario:
RUN adduser node root ... RUN chown -R node:node /home/node/app USER 1000 En la pregunta original, los archivos de la aplicación ya son propiedad de root.
El siguiente chmod es suficiente para hacerlos legibles y ejecutables para el mundo.
RUN chmod -R 775 /home/node/app