web-dev-qa-db-fra.com

docker-compose, exécuter un script après le début du conteneur?

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?

8
Blooze

L'astuce consiste à écraser la commande de composition pour exécuter l'action d'init nécessaire avant d'appeler la commande d'origine.

  1. Ajoutez un script dans votre image qui effectuera le travail d'initialisation souhaité, comme définir un mot de passe, modifier les fichiers de configuration internes, etc. Appelons-le init.sh. Vous l'ajoutez à votre image.

Dockerfile:

FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
  1. Maintenant, dans votre fichier de composition de docker, appelez simplement ce script init avant d’effectuer l’action principale du conteneur.

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.

1
Alkaline

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>
0
VonC