¿Cómo agrego un usuario cuando uso Alpine como imagen base?

108

Estoy usando alpine(o una imagen basada en Alpine) como imagen base en mi Dockerfile. ¿Qué instrucciones necesito agregar para crear un usuario?

Eventualmente usaré este usuario para ejecutar la aplicación que colocaré en el contenedor para que el usuario root no lo haga.

Daniel Gartmann
fuente

Respuestas:

222

Alpine usa el comando addusery addgrouppara crear usuarios y grupos (en lugar de useraddy usergroup).

FROM alpine:latest

# Create a group and user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Tell docker that all future commands should run as the appuser user
USER appuser

Las banderas para adduserson:

Uso: adduser [OPCIONES] USER [GROUP]

Crear nuevo usuario o agregar USUARIO a GRUPO

        -h DIR Directorio de inicio
        -g GECOS Campo GECOS
        -s SHELL Shell de inicio de sesión
        -G Grupo GRP
        -S Crear un usuario del sistema
        -D No asigne una contraseña
        -H No crea directorio de inicio
        -u ID de usuario de UID
        -k Directorio de esqueleto SKEL (/ etc / skel)

Agregar nuevos documentos oficiales de usuario

Daniel Gartmann
fuente
7
O alternativamente, puede reemplazar todo el fragmento anterior usando esto: USER 405que es el usuario invitado dentro de Alpine Linux.
Daniel Gartmann
8
¿Por qué no USER guest?
user672009
3
Me gustaría crear un nuevo usuario porque quiero que ese usuario tenga el mismo UID / GID que el del sistema operativo host, de modo que no haya problemas de permisos al ejecutar Docker en Linux. (no es un problema con los usuarios de macOS / Windows)
elquimista
5
Tenga en cuenta que desde los Alpes se basa en BusyBox, sus addusery addgrouplos comandos son diferentes de adduser, y addgroupconforme a lo dispuesto por Debian y Ubuntu que a su vez son extremos delanteros a useraddy groupadd. En particular, los comandos de Debian y Ubuntu solo admiten opciones de formato largo. Ver: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack
Ya creé un contenedor de ventana acoplable, ahora, ¿qué comando necesito ejecutar para agregar un usuario?
Aashish Kumar
67

Los comandos son addusery addgroup.

Aquí hay una plantilla para Docker que puede usar en entornos de busybox (alpine) así como en entornos basados ​​en Debian (Ubuntu, etc.):

ENV USER=docker
ENV UID=12345
ENV GID=23456

RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "$(pwd)" \
    --ingroup "$USER" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

Tenga en cuenta lo siguiente:

  • --disabled-password evita la solicitud de una contraseña
  • --gecos "" elude la solicitud de "Nombre completo", etc. en sistemas basados ​​en Debian
  • --home "$(pwd)"establece la casa del usuario en WORKDIR. Puede que no quieras esto.
  • --no-create-home evita que cruft se copie en el directorio desde /etc/skel

En la descripción de uso de estas aplicaciones faltan los indicadores largos presentes en el código para adduser y addgroup .

Los siguientes indicadores de formato largo deberían funcionar tanto en alpine como en los derivados de Debian:

agregar usuario

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

        --home DIR           Home directory
        --gecos GECOS        GECOS field
        --shell SHELL        Login shell
        --ingroup GRP        Group (by name)
        --system             Create a system user
        --disabled-password  Don't assign a password
        --no-create-home     Don't create home directory
        --uid UID            User id

Una cosa a tener en cuenta es que si --ingroupno está configurado, el GID se asigna para que coincida con el UID. Si el GID correspondiente al UID proporcionado ya existe, el adduser fallará.

añadir grupo

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: addgroup [-g GID] [-S] [USER] GROUP

Add a group or add a user to a group

        --gid GID  Group id
        --system   Create a system group

Descubrí todo esto mientras intentaba escribir mi propia alternativa al proyecto fixuid para ejecutar contenedores como hosts UID / GID.

Mi script auxiliar de punto de entrada se puede encontrar en GitHub.

La intención es anteponer ese script como el primer argumento al ENTRYPOINTque debería hacer que Docker infiera UID y GID de un montaje de enlace relevante.

Es posible que se requiera una variable de entorno "PLANTILLA" para determinar de dónde se deben inferir los permisos.

(En el momento de escribir este artículo, no tengo documentación para mi script. ¡Todavía está en la lista de tareas pendientes!)

rexypoo
fuente
11
+1, el uso de forma larga para los argumentos de comando aumenta la legibilidad y facilita el mantenimiento. Cuando escriba scripts de shell, utilice siempre la forma larga (Dockerfile RUN no es más que un script de shell).
Victor Schröder