web-dev-qa-db-fra.com

Démarrer le service en utilisant systemctl dans le conteneur de menu fixe

Dans mon fichier Docker, j'essaie d'installer plusieurs services et je souhaite qu'ils démarrent automatiquement lorsque je lance le conteneur. L'un des services est mysql et lorsque je lance le conteneur, le service mysql ne démarre pas. Lorsque j'essaie de démarrer manuellement, j'obtiens le message suivant: Failed to get D-Bus connection: Operation not permitted

Dockerfile:

FROM centos:7

RUN yum -y install mariadb mariadb-server

COPY start.sh start.sh

CMD ["/bin/bash", "start.sh"]

Mon fichier start.sh:

service mariadb start

Docker build:

docker build --tag="pbellamk/mariadb" .

Docker run:

docker run -it -d --privileged=true pbellamk/mariadb bash

J'ai vérifié l'image centos:systemd et cela n'aide pas non plus. Comment lancer le conteneur avec les services démarrés à l'aide des commandes systemctl/service.

3
Premchand

Lorsque vous exécutez docker run avec bash en tant que commande, le système init (par exemple, SystemD) ne démarre pas (pas plus que votre script de démarrage, car la commande que vous passez remplace la CMD dans le fichier Docker). Essayez de changer la commande que vous utilisez en /sbin/init, démarrez le conteneur en mode démon avec -d, puis cherchez dans un shell à l'aide de docker exec -it <container id> sh.

7
Dima Spivak

Docker est conçu autour de l’idée d’un service/processus unique par conteneur. Bien qu'il prenne définitivement en charge l'exécution de plusieurs processus dans un conteneur et ne l'empêche en aucune manière de le faire, vous rencontrerez éventuellement des zones où plusieurs services d'un conteneur ne correspondent pas vraiment à ce que Docker ou les outils externes attendent. Des éléments tels que le passage à l'échelle des services ou l'utilisation de Docker swarm sur plusieurs hôtes ne prennent en charge que le concept d'un service par conteneur.

Docker Compose vous permet de composer plusieurs conteneurs en une seule définition, ce qui signifie que vous pouvez utiliser davantage de conteneurs standard prédéfinis ( httpd , mariadb ) plutôt que construire le vôtre. Composez les définitions en correspondance avec Docker Swarm services assez facilement. Regardez également Kubernetes et Marathon / Mesos pour gérer des groupes de conteneurs en tant que service.

Gestion de processus dans Docker

Il est possible de exécuter systemd dans un conteneur, mais il nécessite --privileged un accès à l'hôte et au volume /sys/fs/cgroup montés, de sorte qu'ils ne conviennent peut-être pas à la plupart des cas d'utilisation.

Le projet s6-overlay fournit un système de gestion de processus plus convivial pour les dockers utilisant s6 .

Il est assez rare que vous ayez réellement besoin d'un accès ssh dans un conteneur, mais si c'est une exigence absolue, vous allez être obligé de construire vos propres conteneurs et d'utiliser un gestionnaire de processus.

3
Matt

Vous pouvez éviter d'exécuter un démon systemd à l'intérieur d'un conteneur de menu fixe. Vous pouvez même éviter d'écrire un script spécial start.sh, ce qui constitue un autre avantage lorsque vous utilisez le script docker-systemctl-replacement .

Le système docker systemctl.py peut analyser les fichiers * .service habituels pour savoir comment démarrer et arrêter les services. Vous pouvez l'enregistrer en tant que CMD d'une image, auquel cas il recherchera tous les services compatibles avec systemctl - ceux-ci seront démarrés et arrêtés dans le bon ordre.

La suite de tests actuelle inclut des cas de test pour la pile LAMP, y compris les centos, de sorte qu'elle fonctionne correctement dans votre configuration.

1
Guido U. Draheim

J'ai trouvé ce projet:

https://github.com/defn/docker-systemd

qui peut être utilisé pour créer une image basée sur l'image stock d'ubuntu mais avec le mode systemd et multi-utilisateur.

Mon cas d'utilisation est le premier mentionné dans son fichier Readme. Je l'utilise pour tester le script d'installation de mon application installée en tant que service systemd. Le programme d’installation crée un service systemd puis l’active et le démarre. J'ai besoin de tests de CI pour l'installateur. Le test doit créer le programme d'installation, installer l'application sur un ubuntu et se connecter au service de l'extérieur.

Sans systemd, le programme d'installation échouerait et il serait beaucoup plus difficile d'écrire le test avec vagabond. Il existe donc des cas d'utilisation valables pour systemd in docker.

0
espakm