GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ausführen von OpenSSH in einem Alpine-Docker-Container

Auch wenn mir einige Details noch nicht klar sind, lassen Sie mich an der Diskussion teilnehmen. Die durch die folgende Konfiguration angegebene Lösung funktioniert für mich. Es ist das Ergebnis mühsamer Experimente.

Zuerst das 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"]

Als nächstes /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]"

Als nächstes /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

Die letzten beiden Zeilen sind das Herzstück des Tricks. Insbesondere der sudo /etc/init.d/sshd --dry-run start sorgt dafür, dass die Lösung funktioniert.

Schließlich Kommandozeilen-Steuerelemente

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)

Ich weiß, ich weiß, es gibt viele unnötige Konstrukte. Das Beispiel widerspricht auch dem Single-Service-Docker-Container-Prinzip. Aber es gibt Phasen und Situationen in der Lösungsentwicklung und im Lebenszyklus der Bereitstellung, die es rechtfertigen (oder zumindest verlocken), den Container um die sshd oder andere openrc-gesteuerte Dienste zu erweitern.


Ein Container ist keine vollständig installierte Umgebung. Das offizielle Dokument ist dafür, dass Alpine auf einer Maschine installiert ist. Mit eingeschalteten, hochfahrenden Diensten usw., die ein Container nicht hat.

Also alles in /etc/init.d/ kann nicht direkt in einem Container verwendet werden, der vom Startdienst verwendet wird (wie systemd oder alpines rc*). Aus diesem Grund erhalten Sie Fehlermeldungen, die den rc* verursachen ist nicht im Container installiert.

Was Sie tun müssen, ist, sshd manuell zu starten. Sie können sich das folgende Beispiel ansehen:

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


/etc/init.d/sshd:nicht gefunden

Versuchen Sie, diese Befehle auszuführen:

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

Linux
  1. So installieren Sie Docker unter Ubuntu 22.04

  2. Erkunden des Dateisystems des Docker-Containers

  3. Wie lautet die PID im Host eines Prozesses, der in einem Docker-Container ausgeführt wird?

  4. Wie kann der Docker-Alpine-Container aufbewahrt werden, nachdem der Ausgang verwendet wurde?

  5. Wie wird der Hostname für den laufenden Container angegeben?

Wie man SSH in einen laufenden Docker-Container einfügt und Befehle ausführt

So überprüfen Sie, ob der Docker-Daemon oder ein Container ausgeführt wird

So erstellen Sie ein Docker-Image aus einem laufenden Container

So führen Sie SSH in einen Docker-Container ein

So verwalten Sie Docker-Container

Starten einer Shell im Container Docker Alpine