web-dev-qa-db-fra.com

Utiliser Sudo dans Dockerfile (Alpine)

J'ai ce Dockerfile ...

FROM keymetrics/pm2:latest-Alpine

RUN apk update && \
    apk upgrade && \
    apk add \
       bash

COPY . ./

EXPOSE 1886 80 443

CMD pm2-docker start --auto-exit --env ${NODE_ENV} ecosystem.config.js

Comment puis-je exécuter la commande CMD en utilisant Sudo?

Je dois le faire car le port 443 n'est autorisé que pour l'utilisateur Sudo.

9
ridermansb

Le su-exec peut être utilisé dans Alpine. Ajoutez-le le paquet, s'il n'est pas déjà disponible, ajoutez ce qui suit à votre Dockerfile

RUN apk add --no-cache su-exec

Dans vos scripts que vous exécutez dans Docker, vous pouvez utiliser ce qui suit pour devenir un autre utilisateur:

exec su-exec <my-user> <my command>

Alternativement, vous pouvez ajouter le package Sudo plus familier lors de la construction de votre fichier docker Ajoutez ce qui suit à votre Dockerfile FROM Alpine

RUN set -ex && apk --no-cache add Sudo

Après cela, vous pouvez utiliser Sudo

Sudo -u <my-user> <my command>
16
Gerbrand

Sudo n'est pas expédié avec des images alpines normalement, et il est rarement judicieux de l'inclure à l'intérieur d'un conteneur. Ce dont vous avez besoin n'est pas Sudo pour se connecter à un port à faible numéro, mais l'utilisateur root lui-même, et Sudo est juste un moyen courant d'obtenir un accès root dans des environnements multi-utilisateurs. Si un conteneur comprend Sudo, vous devez soit configurer l'utilisateur avec un mot de passe, soit autoriser l'exécution des commandes sans mot de passe. Indépendamment de ce que vous avez choisi, vous avez maintenant une élévation de privilèges à l'intérieur du conteneur, ce qui va à l'encontre de l'objectif d'exécuter le conteneur en tant qu'utilisateur normal, vous pouvez donc aussi exécuter le conteneur en tant que root à ce stade.

Si l'image en amont est configurée pour s'exécuter en tant qu'utilisateur non root (peu probable puisque vous exécutez les commandes apk pendant la génération), vous pouvez spécifier USER root dans votre Dockerfile, et toutes les étapes suivantes seront exécutées en tant que root par défaut, y compris le point d'entrée du conteneur/cmd.

Si vous démarrez votre conteneur en tant qu'utilisateur différent, par exemple docker run -u 1000 your_image, puis pour exécuter votre commande en tant que root, vous supprimez le -u 1000 option. Cela peut être un problème si vous exécutez votre conteneur dans des environnements de sécurité supérieure qui limitent les conteneurs à s'exécuter en tant qu'utilisateurs non root.

Si votre application elle-même supprime les privilèges root, il est peu probable que l'inclusion de Sudo ne soit pas utile, sauf si l'application elle-même a des appels à Sudo en interne. Si tel est le cas, mettez à jour l'application pour supprimer les privilèges root après la liaison aux ports.

Plus important encore, si la seule raison pour laquelle root à l'intérieur de votre conteneur est de se lier à des ports de faible numéro, configurez votre application à l'intérieur du conteneur pour se lier à un port de numéro élevé, par ex. 8080 et 8443. Vous pouvez mapper ce port de conteneur sur n'importe quel port de l'hôte, y compris 80 et 443, de sorte que le monde extérieur ne voit aucun impact. Par exemple. docker run -p 80:8080 -p 443:8443 your_image. Cela simplifie votre image (en supprimant des outils comme Sudo) et augmente en même temps votre sécurité.

6
BMitch