Como adiciono um usuário ao usar o Alpine como imagem de base?

99

Estou usando alpine(ou uma imagem baseada no Alpine) como imagem base em meu Dockerfile. Quais instruções eu preciso adicionar para criar um usuário?

Eventualmente, usarei esse usuário para executar o aplicativo que colocarei no contêiner para que o usuário root não o faça.

Daniel Gartmann
fonte

Respostas:

207

Alpine usa o comando addusere addgrouppara criar usuários e grupos (ao invés de useradde 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

As bandeiras para addusersão:

Uso: adduser [OPÇÕES] USUÁRIO [GRUPO]

Crie um novo usuário ou adicione USUÁRIO ao GRUPO

        -h Diretório inicial DIR
        -g campo GECOS GECOS
        Shell de login -s SHELL
        -G Grupo GRP
        -S Criar um usuário do sistema
        -D Não atribua uma senha
        -H Não cria diretório inicial
        -u ID de usuário UID
        -k Diretório SKEL Skeleton (/ etc / skel)

Adicionar novos documentos oficiais do usuário

Daniel Gartmann
fonte
7
Ou, alternativamente, você pode substituir todo o trecho acima usando o seguinte: USER 405que é o usuário convidado no Alpine Linux.
Daniel Gartmann
8
Porque não USER guest?
user672009
3
Eu criaria um novo usuário porque quero que ele tenha o mesmo UID / GID que o do sistema operacional host, de modo que não haja problemas de permissão ao executar o docker no Linux. (não é um problema para usuários do macOS / Windows)
elquimista
5
Observe que, como Alpine é baseado no BusyBox, seus comandos addusere addgroupsão diferentes addusere addgroupfornecidos pelo Debian e Ubuntu que, por sua vez, são front-ends para useradde groupadd. Notavelmente, os comandos Debian e Ubuntu suportam apenas opções de formato longo. Veja: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack
Já criei um contêiner do docker, agora que comando preciso executar para adicionar um usuário?
Aashish Kumar
63

Os comandos são addusere addgroup.

Este é um modelo para Docker que você pode usar em ambientes busybox (alpino), bem como ambientes baseados em 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"

Observe o seguinte:

  • --disabled-password impede a solicitação de uma senha
  • --gecos "" contorna o prompt de "Nome completo" etc. em sistemas baseados em Debian
  • --home "$(pwd)"define a casa do usuário como WORKDIR. Você pode não querer isso.
  • --no-create-home evita que dados cruft sejam copiados para o diretório de /etc/skel

A descrição de uso para esses aplicativos não contém os sinalizadores longos presentes no código para adduser e addgroup .

Os seguintes sinalizadores de formato longo devem funcionar tanto em derivados alpinos quanto em debian:

adicionar usuário

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

Uma coisa a notar é que se --ingroupnão estiver definido, o GID é atribuído para corresponder ao UID. Se o GID correspondente ao UID fornecido já existir, o adduser falhará.

adicionar 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

Eu descobri tudo isso enquanto tentava escrever minha própria alternativa ao projeto fixuid para executar contêineres como hosts UID / GID.

Meu script auxiliar do entrypoint pode ser encontrado no GitHub.

A intenção é anexar esse script como o primeiro argumento para o ENTRYPOINTqual deve fazer o Docker inferir UID e GID de uma montagem de ligação relevante.

Uma variável de ambiente "TEMPLATE" pode ser necessária para determinar de onde as permissões devem ser inferidas.

(No momento em que estou escrevendo, não tenho a documentação do meu script. Ele ainda está na lista de tarefas !!)

rexypoo
fonte
9
+1, o uso de formato longo para argumentos de comando aumenta a legibilidade e torna a manutenção mais fácil. Ao escrever scripts shell sempre usar a forma longa (Dockerfile RUN é nada mais do que um script shell).
Victor Schröder