web-dev-qa-db-fra.com

Impossible d'exécuter la commande sysctl dans Dockerfile

J'essaie de créer mon premier dockerfile (je suis nouveau dans ce domaine) et j'ai besoin du système pour exécuter la commande sysctl -w kernel.randomize_va_space=0 (c'est un laboratoire env.), mais je reçois l'erreur:

sysctl: définition de la clé "kernel.randomize_va_space": système de fichiers en lecture seule

Chaque fois que j'essaye de construire le dockerfile, une suggestion pour contourner ce problème?

FROM avatao/lesp:ubuntu-14.04

USER root

COPY ./solvable/ /

RUN sysctl -w kernel.randomize_va_space=0

VOLUME ["/tmp"]

EXPOSE 2222

WORKDIR /home/user/

USER user

CMD ["/usr/sbin/sshd", "-Df", "/etc/ssh/sshd_config_user"]
3
neorus

Étant donné que les conteneurs Docker partagent le noyau du système hôte et ses paramètres, un conteneur Docker ne peut généralement pas exécuter sysctl du tout. (Vous ne pouvez surtout pas désactiver les paramètres critiques pour la sécurité comme celui-ci.) Vous pouvez définir un nombre limité de sysctls sur une base locale de conteneur avec docker run --sysctl , mais celui que vous mentionnez n'en fait pas partie.

De plus, vous ne pouvez pas non plus forcer des modifications comme celle-ci dans un Dockerfile. Une image Docker contient uniquement un système de fichiers et certaines métadonnées associées, et non aucun processus en cours d'exécution ou paramètres du système hôte. Même si cela RUN sysctl a fonctionné, si vous redémarriez votre système puis lanciez un conteneur à partir de l'image, ce paramètre serait perdu.

Compte tenu de ce que vous avez montré dans ce Dockerfile - paramètres du noyau Linux personnalisés, aucune application spécifique en cours d'exécution, un démon ssh ouvert comme processus de conteneur - vous pourriez vous demander si une machine virtuelle correspond mieux à vos besoins. Vous pouvez utiliser un outil tel que Packer pour créer de manière reproductible une image VM de la même manière qu'un Dockerfile crée une image Docker. Comme un VM possède un noyau isolé, vous pouvez y exécuter cette commande sysctl et cela fonctionnera, peut-être via un full-Linux normal -des méthodes d'installation comme un /etc/sysctl.conf fichier.

5
David Maze

Cela est attendu car docker restreint l'accès à /proc et /sys (pour la sécurité). Fondamentalement, pour réaliser ce que vous essayez, vous devez soit donner à l'utilisateur CAP_SYS_ADMIN ou exécuté en mode privilégié, aucun des deux n'est autorisé pendant build, voir { issue }.

Actuellement, si vous pouvez exécuter ces éléments après l'exécution du conteneur, vous pouvez utiliser soit --cap-add=SYS_ADMIN ou --privileged drapeau. Idéalement, ce ne sont pas des choses que nous ferions dans un système de production, mais vous semblez fonctionner dans une configuration de laboratoire. Si vous le faites au stade run, je vous recommande d’essayer d’abord le --sysctl flag, mais qui ne prend en charge qu'un sous-ensemble de commandes et je ne sais pas si cela vous permettra de modifier les paramètres du noyau.

4
Debosmit Ray