El truco es usar useradd
en lugar de su contenedor interactivo adduser
.Yo suelo crear usuarios con:
RUN useradd -ms /bin/bash newuser
que crea un directorio de inicio para el usuario y garantiza que bash sea el shell predeterminado.
A continuación, puede agregar:
USER newuser
WORKDIR /home/newuser
a su archivo acoplable. Todos los comandos posteriores, así como las sesiones interactivas, se ejecutarán como usuario newuser
:
docker run -t -i image
[email protected]:~$
Puede que tengas que dar newuser
los permisos para ejecutar los programas que desea ejecutar antes de invocar el comando de usuario.
Usar usuarios sin privilegios dentro de contenedores es una buena idea por razones de seguridad. También tiene algunos inconvenientes. Lo que es más importante, las personas que obtengan imágenes de su imagen tendrán que volver a la raíz antes de poder ejecutar comandos con privilegios de superusuario.
Agregar un usuario en la ventana acoplable y ejecutar su aplicación con ese usuario es una muy buena práctica desde el punto de vista de la seguridad. Para hacerlo, recomendaría los siguientes pasos:
FROM node:10-alpine
# Copy source to container
RUN mkdir -p /usr/app/src
# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app
WORKDIR /usr/app
# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production
# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup
# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup
# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app
# Switch to 'appuser'
USER appuser
# Open the mapped port
EXPOSE 3000
# Start the process
CMD ["npm", "start"]
Los pasos anteriores son un ejemplo completo de la copia de archivos de proyecto de NodeJS, la creación de un grupo de usuarios y un usuario, la asignación de permisos al usuario para la carpeta del proyecto, el cambio al usuario recién creado y la ejecución de la aplicación con ese usuario.
Ubuntu
Pruebe las siguientes líneas en Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd
opciones (ver:man useradd
):
-r
,--system
Cree una cuenta del sistema.-m
,--create-home
Cree el directorio de inicio del usuario.-d
,--home-dir HOME_DIR
Directorio de inicio de la nueva cuenta.-s
,--shell SHELL
Shell de inicio de sesión de la nueva cuenta.-g
,--gid GROUP
Nombre o ID del grupo principal.-G
,--groups GROUPS
Lista de grupos complementarios.-u
,--uid UID
Especifique el ID de usuario.-p
,--password PASSWORD
Contraseña cifrada de la nueva cuenta (por ejemplo,ubuntu
).
Configuración de la contraseña de usuario predeterminada
Para establecer la contraseña de usuario, agregue -p "$(openssl passwd -1 ubuntu)"
a useradd
comando.
Alternativamente, agregue las siguientes líneas a su Dockerfile
:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
La primera instrucción de shell es asegurarse de que -o pipefail
la opción está habilitada antes de RUN
con una pipa dentro. Leer más:Hadolint:Linting su Dockerfile.
Para evitar las preguntas interactivas de adduser, puede llamarlo con estos parámetros:
RUN adduser --disabled-password --gecos '' newuser
El --gecos
El parámetro se utiliza para configurar la información adicional. En este caso, simplemente está vacío.
En sistemas con busybox (como Alpine), use
RUN adduser -D -g '' newuser
Ver el usuario adicional de busybox