GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter OpenSSH dans un conteneur Alpine Docker

Bien que certains détails ne soient toujours pas clairs pour moi, permettez-moi de prendre part à la discussion. La solution spécifiée par la configuration ci-dessous fonctionne pour moi. C'est le résultat d'expériences ardues.

Tout d'abord, le dockerfile

FROM alpine
RUN apk update && \
apk add --no-cache sudo bash openrc openssh
RUN mkdir -p /run/openrc && \
    touch /run/openrc/softlevel && \
    rc-update add sshd default
RUN adduser --disabled-password regusr && \
    sh -c 'echo "regusr:<encoded_passwd>"' | chpasswd -e > /dev/null 2>&1 && \
    sh -c 'echo "regusr ALL=NOPASSWD: ALL"' >> /etc/sudoers
VOLUME ["/home/reguser/solution/entrypoint-init.d","/sys/fs/cgroup"]
USER reguser
WORKDIR /home/reguser
RUN mkdir -p $HOME/solution && sudo chown reguser:reguser $HOME/solution
ADD ./entrypoint.sh /home/reguser/solution/
EXPOSE 22
ENTRYPOINT ["./solution/entrypoint.sh"]
CMD ["/bin/bash"]

Ensuite, /home/reguser/solution/entrypoint.sh

#!/bin/bash
for f in ./solution/entrypoint-init.d/*; do
    case "$f" in
       *.sh)     echo "$0: running $f"; . "$f" ;;
       *)        echo "$0: ignoring $f" ;;
    esac
    echo
done

exec "[email protected]"

Ensuite, /home/reguser/solution/entrypoint-init.d/10-ssh-up.sh

#!/bin/bash
sudo sed --in-place --expression='/^#[[:space:]]*Port[[:space:]]\+22$/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^#[[:space:]]*AddressFamily[[:space:]]\+any$/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^#[[:space:]]*HostKey[[:space:]]\+\/etc\/ssh\/ssh_host_rsa_key$/ s/^#//i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='/^#[[:space:]]*HostbasedAuthentication[[:space:]].*/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*HostbasedAuthentication[[:space:]].*/ s/^[[:space:]]*\(HostbasedAuthentication\)[[:space:]]\(.*\)/\1 no/i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*HostbasedAuthentication[[:space:]]\+yes.*/ s/^/#/i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='/^#[[:space:]]*IgnoreRhosts[[:space:]].*/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*IgnoreRhosts[[:space:]].*/ s/^[[:space:]]*\(IgnoreRhosts\)[[:space:]]\(.*\)/\1 yes/i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*IgnoreRhosts[[:space:]]\+no.*/ s/^/#/i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='/^#[[:space:]]*PasswordAuthentication[[:space:]].*/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PasswordAuthentication[[:space:]].*/ s/^[[:space:]]*\(PasswordAuthentication\)[[:space:]]\(.*\)/\1 yes/i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PasswordAuthentication[[:space:]]\+no.*/ s/^/#/i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='/^#[[:space:]]*PubkeyAuthentication[[:space:]].*/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PubkeyAuthentication[[:space:]].*/ s/^[[:space:]]*\(PubkeyAuthentication\)[[:space:]]\(.*\)/\1 yes/i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PubkeyAuthentication[[:space:]]\+no.*/ s/^/#/i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='/^#[[:space:]]*PrintMotd[[:space:]].*/ s/^#//i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PrintMotd[[:space:]].*/ s/^[[:space:]]*\(PrintMOTD\)[[:space:]]\(.*\)/\1 no/i' -- /etc/ssh/sshd_config
sudo sed --in-place --expression='/^[[:space:]]*PrintMotd[[:space:]]\+yes.*/ s/^/#/i' -- /etc/ssh/sshd_config

sudo sed --in-place --expression='$ a\' --expression='\nAcceptEnv LANG LC_\*' -- /etc/ssh/sshd_config

sudo /etc/init.d/sshd --dry-run start
sudo /etc/init.d/sshd start

Les deux dernières lignes sont au cœur du tour. En particulier, le sudo /etc/init.d/sshd --dry-run start fait fonctionner la solution.

Enfin, les contrôles de ligne de commande

docker build --tag='dockerRegUser/sshdImg:0.0.1' --file='./dockerfile' .
docker container create --tty \
       --volume $(pwd)/dock/entrypoint-init.d:/home/reguser/solution/entrypoint-init.d:ro \
       --name sshdCnt 'dockerRegUser/sshdImg:0.0.1' tail -f /dev/null
docker start sshdCnt && \
ssh-keygen -f "/home/user/.ssh/known_hosts" -R "$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' sshdCnt)" && \
sleep 5 && \
ssh-copy-id -i ~/.ssh/sshkey [email protected]$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' sshdCnt)

Je sais, je sais, il y a beaucoup de constructions inutiles. L'exemple va également à l'encontre du principe du conteneur docker à service unique. Mais il y a des phases et des situations dans le cycle de vie du développement et de la livraison de la solution qui justifient (ou du moins tentent) d'envisager d'étendre le conteneur avec le sshd ou d'autres services contrôlés par openrc.


Un conteneur n'est pas un environnement installé complet. Le document officiel est pour cet alpin installé sur certaines machines. Avec la mise sous tension, les services de démarrage, etc. qu'un conteneur n'a pas.

Donc, n'importe quoi dans /etc/init.d/ ne peut pas être utilisé directement dans un conteneur utilisé par le service de démarrage (comme systemd ou rc * d'alpine). C'est pourquoi vous avez des messages d'erreur causant le rc* n'est pas installé dans le conteneur.

Ce que vous devez faire est de démarrer sshd manuellement. Vous pouvez consulter l'exemple ci-dessous :

https://hub.docker.com/r/danielguerra/alpine-sshd/~/dockerfile/


/etc/init.d/sshd :introuvable

Essayez d'exécuter ces commandes :

apk add --no-cache openrc
rc-update add sshd

Linux
  1. Comment installer Docker sur Ubuntu 22.04

  2. Exécution de docker sur Ubuntu :le volume hôte monté n'est pas accessible en écriture à partir du conteneur

  3. Démarrer un shell dans le conteneur Docker Alpine

  4. Quel est le PID dans l'hôte d'un processus exécuté dans un conteneur Docker ?

  5. Comment conserver le conteneur docker alpin après l'utilisation de la sortie ?

Comment se connecter en SSH à un conteneur Docker en cours d'exécution et exécuter des commandes

Comment vérifier si le démon Docker ou un conteneur est en cours d'exécution

Comment créer une image Docker à partir d'un conteneur en cours d'exécution

Comment se connecter en SSH à un conteneur Docker

Comment gérer les conteneurs Docker

Quel système d'exploitation s'exécute dans mon conteneur Docker ?