docker - 如何在 Docker 容器中启动 SSHD

标签 docker

如何配置 SSHD 以在 Docker 中运行?我正在尝试编写一个单元测试来检查一些 SSH 登录命令,但我无法让容器通过 SSH 登录到自身。

我有 Dockerfile:

FROM ubuntu:18.04
ENV PYTHONUNBUFFERED 1

USER root

RUN apt-get -yq update --fix-missing && apt-get -yq install sudo

# Enable Supervisord/SSH.
RUN apt-get -yq update && apt-get install -yq openssh-server supervisor
RUN mkdir -p /var/run/sshd /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 22 80

COPY ./id_rsa.pub /home/ubuntu/.ssh/authorized_keys
RUN chmod og-wx /home/ubuntu/.ssh/authorized_keys

# Install code.
RUN mkdir -p /myproject
COPY . /myproject/
WORKDIR /myproject

CMD ./runtest.sh

我正在使用 runtest.sh同时启动 SSHD 和我的测试命令,例如:
#!/bin/bash
set -e

echo "Starting Supervisord..."
/usr/bin/supervisord &
sleep 5

echo "Running tests..."
ssh -o "StrictHostKeyChecking=no" -i ./id_rsa ubuntu@localhost echo 'hello world'
echo 'Tests run!'

但是,即使 SSHD 似乎可以正确启动,并且我已经为无密码登录配置了 key ,ssh login test 命令仍会失败并出现以下错误:
Starting Supervisord...
Running tests...
/usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
2019-11-25 20:23:56,060 CRIT Supervisor running as root (no user in config file)
2019-11-25 20:23:56,067 INFO supervisord started with pid 8
2019-11-25 20:23:57,071 INFO spawned: 'sshd' with pid 12
2019-11-25 20:23:58,073 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Permission denied, please try again.
Permission denied, please try again.
ubuntu@localhost: Permission denied (publickey,password).

为什么我无法通过 SSH 登录到我的容器?

编辑: ssh 命令的详细输出是:
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "localhost" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: SELinux support disabled
debug1: key_load_public: No such file or directory
debug1: identity file ./id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file ./id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: match: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK
debug1: Authenticating to localhost:22 as 'ubuntu'
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
debug3: receive packet: type 20
debug1: SSH2_MSG_KEXINIT received
debug2: local client KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,ext-info-c
debug2: host key algorithms: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com,zlib
debug2: compression stoc: none,zlib@openssh.com,zlib
debug2: languages ctos: 
debug2: languages stoc: 
debug2: first_kex_follows 0 
debug2: reserved 0 
debug2: peer server KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
debug2: host key algorithms: ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com
debug2: compression stoc: none,zlib@openssh.com
debug2: languages ctos: 
debug2: languages stoc: 
debug2: first_kex_follows 0 
debug2: reserved 0 
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 31
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:suhccUuYtkjZxG1IWq4nvKlLIQ9i6IcLBG16c4+Fhmk
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
debug3: send packet: type 21
debug2: set_newkeys: mode 1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug3: receive packet: type 21
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey after 134217728 blocks
debug2: key: ./id_rsa ((nil)), explicit
debug3: send packet: type 5
debug3: receive packet: type 7
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: ./id_rsa
debug3: sign_and_send_pubkey: RSA SHA256:sGFbfZpSWfA5zo84FcTlI5SHR0DKGlQmGROFlnhKVsE
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
Connection closed by 127.0.0.1 port 22

我怀疑这条线 key_load_public: No such file or directory表示它找不到 id_rsa key ,虽然我不确定为什么,因为它 id_rsa 和 id_rsa.pub 肯定存在于 CWD 中并且具有正确的权限。

最佳答案

从错误消息中不清楚,但问题是我的 ssh 命令(ubuntu)中的用户与 Docker 容器中的用户(root)不匹配。一旦我匹配了它们,我就可以 ssh 进入容器。

关于docker - 如何在 Docker 容器中启动 SSHD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59039607/

相关文章:

ruby - 如何在没有构建工具的情况下为 Ruby 项目构建 Docker 镜像?

amazon-web-services - 如何在 AWS Batch 上使用 docker compose?

bash - Dockerfile 更改用户访问失败

docker 忽略 daemon.json 文件

azure - 如何在 Azure Devops 的容器构建任务中使用文件转换任务的结果

docker - 如何告诉 docker-compose exec 从 stdin 读取?

spring-boot - 我应该选择哪个平台为我的微服务端项目安装一些环境?

戈朗 :sshfs -o reconnect fails when used inside docker container with "reading directory .: Input/output error"

mysql - 在 docker/docker-compose 中连接 Python 和 MySQL

docker - 查看 Docker 中运行/停止容器的完整命令