Você tem três métodos para obter segredos para um aplicativo dentro de um contêiner de docker. Os dois primeiros envolvem a configuração do docker. O último é que seus aplicativos obtenham segredos diretamente de uma loja secreta.
1 - Variáveis de ambiente
De acordo com o guia "The 12 Factor App" , os segredos são meramente configurações e sempre devem ser definidos no ambiente. Você pode definir seus segredos como variáveis de ambiente durante a execução da janela de encaixe e o aplicativo os acessa a partir daí.
2 - Volumes montados
Você pode ter todos os seus segredos em um arquivo de configuração / segredos específico e montá-lo em sua instância como um volume montado .
3 - Buscar na loja secreta
Como @ 030 mencionado, você pode usar o Hashicorp Vault (ou "Amazon Secrets Manager" ou qualquer serviço desse tipo).
Seu aplicativo ou um side-car pode buscar diretamente os segredos de que precisa, sem precisar lidar com nenhuma configuração no contêiner do Docker. Esse método permite que você use segredos criados dinamicamente (um recurso muito atraente de tais sistemas) e sem ter que se preocupar com os segredos que podem ser visualizados no sistema de arquivos ou com a inspeção das variáveis env do contêiner do docker.
Opinião pessoal
Eu acredito que as variáveis env são o caminho a percorrer. É mais fácil de gerenciar, e você ainda pode obter de um armazenamento secreto como o Hashicorp Vault, se tiver o sistema de criação de CI, extrair os segredos durante a criação e defini-los quando você implantar. Você obtém o melhor dos dois mundos e o benefício adicional de seus desenvolvedores não precisarem escrever código de aplicativo para buscar segredos. Os desenvolvedores devem se concentrar em sua funcionalidade de código e não em tarefas administrativas, como a busca de senhas.
O código do seu aplicativo deve se concentrar na própria funcionalidade do aplicativo e não em tarefas de back-end, como buscar senhas. Assim como os 12 estados do App Fator.
Editar: última frase alterada para remover as implicações do silenciador Developer vs SysAdmin. As tarefas em si devem ser separadas da perspectiva do código, mas o DevOps é sobre as mesmas pessoas, mantendo em mente e não se limitando.
Opinião pessoal (atualização)
Pelo excelente comentário do Per @ Dirk ( Passando segredos para um contêiner do Docker ), há um argumento muito forte para priorizar um armazenamento secreto sobre os vars ENV, por não querer vazá-los.