Todos os processos no contêiner serão executados como usuário root, a menos que você o especifique de uma maneira especial. Isto parece muito conveniente, porque este usuário não tem restrições. É por isso que trabalhar como root é errado do ponto de vista da segurança. Se ninguém em sã consciência trabalha no computador local com direitos de root, muitos executam processos sob root em contêineres.
Sempre há bugs que permitem que o malware escape do contêiner e entre no computador host. Supondo o pior, devemos garantir que os processos dentro do contêiner sejam executados por um usuário que não tenha quaisquer direitos na máquina host.
Criando um usuário
Criar um usuário em um contêiner não é diferente de criá-lo em distribuições Linux. No entanto, os comandos podem variar para diferentes imagens base.
Para distribuições baseadas em Debian, você precisa adicionar o seguinte ao Dockerfile:
RUN groupadd --gid 2000 node
&& useradd --uid 2000 --gid node --shell /bin/bash --create-home node
Para alpino:
RUN addgroup -g 2000 node
&& adduser -u 2000 -G node -s /bin/sh -D node
Executando processos do usuário
Para executar todos os processos subsequentes como usuário com UID 2000, execute:
USER 2000
Para executar todos os processos subsequentes como usuário do nó, execute:
USER node
Mais em
Montando volumes
Ao montar volumes dentro de um contêiner, forneça ao usuário a capacidade de ler e/ou gravar arquivos. Para fazer isso, o UID (GID) do usuário no contêiner e o usuário fora do contêiner que possui as permissões apropriadas para acessar o arquivo devem corresponder. Neste caso, os nomes de usuário não importam.
Freqüentemente, em um computador Linux, o UID e o GID de um usuário são iguais a 1000. Esses identificadores são atribuídos ao primeiro usuário do computador.
Descobrir seus identificadores é fácil:
id
Você receberá informações abrangentes sobre seu usuário.
Substitua 2000 dos exemplos pelo seu identificador e tudo ficará bem.
Atribuindo um UID e GID a um usuário
Se o usuário foi criado anteriormente, mas você precisa alterar os identificadores, você pode fazer assim:
RUN usermod -u 1000 node
&& groupmod -g 1000 node
Se você estiver usando a imagem base alpina, será necessário instalar o pacote shadow:
RUN apk add —no-cache shadow
Passando o ID do usuário dentro do contêiner ao construir a imagem
Se o seu ID e os IDs de todas as pessoas que trabalham no projeto corresponderem, basta especificar esse ID no Dockerfile. No entanto, muitas vezes os IDs de usuário não coincidem.
Como conseguir o que deseja não está imediatamente claro. Para mim, essa foi a parte mais difícil no processo de domínio do Docker. Muitos usuários do Docker não percebem que existem diferentes estágios na vida de uma imagem. Primeiro, a imagem é montada usando um Dockerfile. Ao executar um contêiner a partir de uma imagem, o Dockerfile não é mais usado.
A criação do usuário deve ocorrer quando a imagem é construída. O mesmo se aplica à determinação do usuário sob o qual os processos são iniciados. Isso significa que devemos de alguma forma passar o UID (GID) dentro do contêiner.
Diretivas são usadas para usar variáveis externas no Dockerfile
dockerfile
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node
&& groupmod -g $GID node
Você pode passar argumentos via docker-compose assim:
docker-compose
build:
context: ./src/backend
args:
UID: 1000
GID: 1000
PS Para dominar todos os meandros do Docker, não basta ler a documentação ou os artigos. Você precisa praticar muito, precisa conhecer o Docker.
Fonte: habr.com