J'ai un service que je présente via Rancher via docker-compose. Le problème que je rencontre est que je dois définir un mot de passe après le déploiement du conteneur.
La façon dont les secrets des éleveurs fonctionnent, est que je mets mon secret dans et que les éleveurs vont monter un volume sur mon conteneur avec un fichier contenant mon secret. J'espérais pouvoir exécuter un script pour récupérer ce secret et le définir comme mot de passe sur mon fichier de configuration.
Je ne pense pas avoir le moyen de faire entrer ce secret par le biais du fichier Docker, car je ne veux pas que le secret soit en git, je suis donc obligé de le faire via docker-compose.
Est-ce que quelqu'un sait si c'est possible?
L'astuce consiste à écraser la commande de composition pour exécuter l'action d'init nécessaire avant d'appeler la commande d'origine.
init.sh
. Vous l'ajoutez à votre image.Dockerfile:
FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
docker-compose.yml:
services:
myservice:
image: something:tag
...
command: /usr/local/bin/init.sh && exec the_original_command_goes_here
Il est important d'utiliser exec
avant d'appeler la commande principale. Cela installera la commande en tant que premier processus (PID1), ce qui lui fera recevoir des signaux tels que stop ou kill.
docker-compose spécifie comment lancer les conteneurs, pas comment modifier un conteneur en cours d'exécution existant.
La documentation Rancher indique que, pour une utilisation par défaut des secrets, vous pouvez référencer le secret par son nom dans le tableau secrets du docker-compose.yml
.
Le nom de fichier cible sera le même nom que le nom du secret.
Par défaut, le nom de fichier cible sera créé en tant qu’ID utilisateur et ID de groupe 0, et le mode de fichier de 0444.
Si vous définissez external sur true dans la partie secrets, vous saurez que le secret a déjà été créé.Exemple de
docker-compose.yml
de base:
version: '2'
services:
web:
image: sdelements/lets-chat
stdin_open: true
secrets:
- name-of-secret
labels:
io.rancher.container.pull_image: always
secrets:
name-of-secret:
external: true
Comme illustré dans " Comment mettre à jour un conteneur unique composé de dockers ", la mise à jour d'un conteneur impliquerait une séquence "build, kill and up".
docker-compose up -d --no-deps --build <service_name>