Definitivamente, é uma preocupação. Dockerfiles geralmente são registrados nos repositórios e compartilhados com outras pessoas. Uma alternativa é fornecer credenciais (nomes de usuário, senhas, tokens, qualquer coisa sensível) como variáveis de ambiente em tempo de execução . Isso é possível através do -e
argumento (para vars individuais na CLI) ou do --env-file
argumento (para várias variáveis em um arquivo) para docker run
. Leia isto para usar ambiental com docker-compose.
--env-file
Definitivamente, usar é uma opção mais segura, pois ela protege contra os segredos que aparecem ps
nos logs ou nos logs, se usados set -x
.
No entanto, os env vars também não são particularmente seguros. Eles são visíveis via docker inspect
e, portanto, estão disponíveis para qualquer usuário que possa executar docker
comandos. (Obviamente, qualquer usuário que tenha acesso ao docker
host também terá raiz, de qualquer maneira.)
Meu padrão preferido é usar um script de wrapper como o ENTRYPOINT
ou CMD
. O script do wrapper pode primeiro importar segredos de um local externo para o contêiner no tempo de execução, depois executar o aplicativo, fornecendo os segredos. A mecânica exata disso varia com base no seu ambiente de tempo de execução. Na AWS, você pode usar uma combinação de funções do IAM, o Key Management Service e o S3 para armazenar segredos criptografados em um bucket do S3. Algo como o HashiCorp Vault ou credstash é outra opção.
AFAIK não existe um padrão ideal para o uso de dados confidenciais como parte do processo de construção. Na verdade, eu tenho uma pergunta SO sobre esse tópico. Você pode usar o docker-squash para remover as camadas de uma imagem. Mas não há funcionalidade nativa no Docker para esse fim.
Você pode encontrar comentários de shykes sobre configuração em contêineres úteis.