Saltar al contenido

Ejecución de OpenSSH en un contenedor Docker de Alpine

Te recomendamos que revises esta resolución en un entorno controlado antes de pasarlo a producción, saludos.

Solución:

Un contenedor no es un entorno completamente instalado. El documento oficial es para eso instalado alpine en alguna máquina. Con servicios de encendido, arranque, etc. que no tiene un contenedor.

Entonces, cualquier cosa en /etc/init.d/ no se puede utilizar directamente en un contenedor utilizado por el servicio de arranque (como systemd o rc* de alpine). Es por eso que recibió mensajes de error porque el rc* no está instalado en el contenedor.

Lo que debe hacer es iniciar sshd manualmente. Puede echar un vistazo al siguiente ejemplo:

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

/etc/init.d/sshd: no encontrado

Intenta ejecutar estos primero:

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

A pesar de que hay algunos detalles que aún no me quedan claros, permítanme tomar una voz en la discusión. La solución especificada por la siguiente configuración funciona para mí. Es el resultado de arduos experimentos.

Primero el archivo acoplable

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:"' | 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"]

Próximo, /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]"

Próximo, /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

Las dos últimas líneas están en el corazón del truco. En particular, el sudo /etc/init.d/sshd --dry-run start hace que la solución funcione.

Por último, los controles de línea de comandos

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)

Lo sé, lo sé, hay muchas construcciones innecesarias. El ejemplo también va en contra del principio del contenedor docker de servicio único. Pero hay fases y situaciones en el ciclo de vida de desarrollo y entrega de soluciones que justifican (o al menos tientan) considerar extender el contenedor con sshd u otros servicios controlados por openrc.

Nos encantaría que puedieras comunicar este tutorial si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *