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 -eargumento (para vars individuais na CLI) ou do --env-fileargumento (para várias variáveis em um arquivo) para docker run. Leia isto para usar ambiental com docker-compose.
--env-fileDefinitivamente, usar é uma opção mais segura, pois ela protege contra os segredos que aparecem psnos 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 inspecte, portanto, estão disponíveis para qualquer usuário que possa executar dockercomandos. (Obviamente, qualquer usuário que tenha acesso ao dockerhost também terá raiz, de qualquer maneira.)
Meu padrão preferido é usar um script de wrapper como o ENTRYPOINTou 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.