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.