GNU/Linux >> Znalost Linux >  >> Linux

Spuštění OpenSSH v kontejneru Alpine Docker

Navzdory tomu, že mi stále nejsou jasné některé podrobnosti, dovolte mi, abych se v diskusi vyjádřil. Řešení specifikované níže uvedenou konfigurací mi funguje. Je to výsledek náročných experimentů.

Nejprve 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"]

Dále /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]"

Dále /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

Poslední dva řádky jsou v srdci triku. Konkrétně sudo /etc/init.d/sshd --dry-run start řešení funguje.

Konečně ovládací prvky příkazového řádku

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)

Vím, vím, je tam spousta zbytečných konstruktů. Tento příklad je také v rozporu s principem kontejneru jediné služby. Existují však fáze a situace ve vývoji řešení a životním cyklu dodání, které opravňují (nebo alespoň svádějí) k úvahám o rozšíření kontejneru o sshd nebo jiné služby řízené openrc.


Kontejner není plně nainstalované prostředí. Oficiální dokument se týká toho, co je na nějakém počítači nainstalováno alpine. Po zapnutí, spouštění služeb atd. kontejner nemá.

Takže cokoli v /etc/init.d/ nelze použít přímo v kontejneru, který používá bootovací služba (jako systemd nebo alpine rc*). To je důvod, proč se vám zobrazily chybové zprávy způsobující rc* není nainstalován v kontejneru.

Co musíte udělat, je spustit sshd ručně. Můžete se podívat na níže uvedený příklad:

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


/etc/init.d/sshd:nenalezeno

Zkuste spustit tyto příkazy:

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

Linux
  1. Předat hostitelský port do kontejneru dockeru

  2. Docker v Dockeru nemůže připojit svazek

  3. Spuštěný docker na Ubuntu:připojený svazek hostitele nelze zapisovat z kontejneru

  1. Spuštění shellu v kontejneru Docker Alpine

  2. Jaké je PID v hostiteli procesu běžícího uvnitř kontejneru Docker?

  3. Jak zachovat docker alpine kontejner po použití?

  1. Shell:Zkontrolujte, zda existuje kontejner Docker?

  2. Jak zadat název hostitele pro běžící kontejner?

  3. Který operační systém běží v mém kontejneru Docker?