Eu tenho um contêiner de encaixe com alguns processos (uwsgi e aipo) em execução no interior. Desejo criar um usuário aipo e um usuário uwsgi para esses processos, bem como um grupo de trabalhadores ao qual ambos pertencerão, para atribuir permissões.
Tentei adicionar RUN adduser uwsgi
e RUN adduser celery
ao meu Dockerfile, mas isso está causando problemas, pois esses comandos solicitam entrada (postamos as respostas da compilação abaixo).
Qual é a melhor maneira de adicionar usuários a um contêiner do Docker para definir permissões para trabalhadores em execução no contêiner?
Minha imagem do Docker foi criada a partir da base oficial do Ubuntu14.04.
Aqui está a saída do Dockerfile quando os comandos adduser são executados:
Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ...
Adding new user `uwsgi' (1000) with group `uwsgi' ...
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []: Work Phone []: Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
---> 258f2f2f13df
Removing intermediate container 59948863162a
Step 5 : RUN adduser celery
---> Running in be06f1e20f64
Adding user `celery' ...
Adding new group `celery' (1001) ...
Adding new user `celery' (1001) with group `celery' ...
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for celery
Enter the new value, or press ENTER for the default
Full Name []: Room Number []: Work Phone []:
Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
fonte
useradd --create-home --shell /bin/bash
é mais compreensível / legível para os colegas de trabalho.RUN echo 'newuser:newpassword' | chpasswd
--no-log-init
opção deuseradd
.USER newuser
. Se você também precisar que o usuário tenha privilégios de root, também poderá incluiradduser <username> sudo
./bin/sh: useradd: not found
alpino linuxPara evitar as perguntas interativas por adduser, você pode chamá-lo com estes parâmetros:
O
--gecos
parâmetro é usado para definir as informações adicionais. Neste caso, está apenas vazio.Em sistemas com busybox (como Alpine), use
Consulte busybox adduser
fonte
adduser
a solução de alto nível é geralmente preferida ao uso de funções de baixo níveluseradd
.adduser: unrecognized option: gecos
Isso não parece funcionar no Alpine.Ubuntu
Tente as seguintes linhas em
Dockerfile
:useradd
opções (consulteman useradd
:):-r
,--system
Crie uma conta do sistema. consulte: Implicações na criação de contas do sistema-m
,--create-home
Crie o diretório inicial do usuário.-d
,--home-dir HOME_DIR
Diretório inicial da nova conta.-s
,--shell SHELL
Shell de login da nova conta.-g
,--gid GROUP
Nome ou ID do grupo principal.-G
,--groups GROUPS
Lista de grupos suplementares.-u
,--uid UID
Especifique o ID do usuário. consulte: Entendendo como uid e gid funcionam em contêineres do Docker-p
,--password PASSWORD
Senha criptografada da nova conta (por exemploubuntu
).Definindo a senha do usuário padrão
Para definir a senha do usuário, adicione
-p "$(openssl passwd -1 ubuntu)"
aouseradd
comandoComo alternativa, adicione as seguintes linhas ao seu
Dockerfile
:A primeira instrução shell é garantir que a
-o pipefail
opção esteja ativada antesRUN
com um pipe nele. Leia mais: Hadolint: Conectando seu Dockerfile .fonte
root
O grupo não indica que eles têm acesso root, apenas têm mais acesso de leitura a alguns arquivos (como logs), o que é útil, mas depende do projeto.Adicionar usuário na janela de encaixe e executar seu aplicativo nesse usuário é uma prática muito boa do ponto de vista da segurança. Para fazer isso, eu recomendaria as etapas abaixo:
As etapas acima são um exemplo completo dos arquivos de projeto de cópia do NodeJS, criando um grupo e um usuário, atribuindo permissões ao usuário para a pasta do projeto, alternando para o usuário recém-criado e executando o aplicativo nesse usuário.
fonte
Você pode imitar o Dockerfile de código aberto, por exemplo:
Nó: node12-github
superset: superset-github
Eu acho que é uma boa maneira de seguir o código aberto.
fonte
Todo mundo tem seu favorito pessoal, e este é meu:
Referencia: man useradd
A
RUN
linha adicionará o usuário e o grupoapp
:Use um nome mais específico do que
app
se a imagem tiver que ser reutilizada como imagem de base. Como um aparte, inclua--shell /bin/bash
se você realmente precisa.Crédito parcial: resposta por Ryan M
fonte
Alternativamente, você pode fazer assim.
O primeiro comando cria um grupo chamado demo . O segundo comando cria um usuário demo e o adiciona ao grupo de demonstração criado anteriormente .
Flags significa:
fonte
Adicione esta linha ao seu Dockerfile (você pode executar qualquer comando linux dessa maneira)
fonte