GNU/Linux >> Belajar Linux >  >> Linux

Menjalankan OpenSSH di Alpine Docker Container

Meskipun ada beberapa detail yang masih belum jelas bagi saya, izinkan saya mengambil suara dalam diskusi. Solusi yang ditentukan oleh konfigurasi di bawah berfungsi untuk saya. Ini adalah hasil dari eksperimen yang sulit.

Pertama, 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"]

Selanjutnya, /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]"

Selanjutnya, /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

Dua baris terakhir berada di inti trik. Secara khusus, sudo /etc/init.d/sshd --dry-run start membuat solusi bekerja.

Terakhir, kontrol baris perintah

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)

Saya tahu, saya tahu, ada banyak konstruksi yang tidak perlu. Contoh ini juga bertentangan dengan prinsip wadah buruh pelabuhan layanan tunggal. Namun ada fase dan situasi dalam pengembangan solusi dan siklus hidup pengiriman yang membenarkan (atau setidaknya menggoda) mempertimbangkan untuk memperluas container dengan sshd atau layanan lain yang dikendalikan oleh openrc.


Kontainer bukanlah lingkungan yang terinstal penuh. Dokumen resmi adalah untuk alpine yang terinstal di beberapa mesin. Dengan daya hidup, layanan boot up, dll. yang tidak dimiliki oleh penampung.

Jadi, apapun yang ada di /etc/init.d/ tidak dapat digunakan secara langsung dalam wadah yang digunakan oleh layanan boot up (seperti systemd, atau rc* alpine). Itu sebabnya Anda mendapat pesan kesalahan yang menyebabkan rc* tidak dipasang di penampung.

Yang perlu Anda lakukan adalah memulai sshd secara manual. Anda dapat melihat contoh di bawah ini:

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


/etc/init.d/sshd:tidak ditemukan

Coba jalankan perintah ini:

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

Linux
  1. Menjalankan buruh pelabuhan di Ubuntu:volume host yang dipasang tidak dapat ditulis dari wadah

  2. Memulai sebuah shell di wadah Docker Alpine

  3. Apa PID di host, dari proses yang berjalan di dalam container Docker?

  1. Pengantar Docker

  2. Bagaimana cara mempertahankan wadah docker alpine setelah exit digunakan?

  3. Bagaimana cara menentukan nama host untuk wadah yang sedang berjalan?

  1. Shell:Periksa Apakah Wadah Docker Ada?

  2. Cara Menjalankan Perintah di Running Docker Container

  3. Cara Menginstal Docker di Ubuntu 22.04