Dockerfile과 SSH 키 쌍을 사용하여 GitLab에서 테스트 프로젝트를 복제하려고 합니다 ssh-keygen -t rsa -P ""
. 개인 키는 비밀번호가 없으며 공개 키는 GitLab 계정에 게시됩니다.
이는 다른 사람이 빠르게 테스트할 수 있습니다. GitLab에서 계정을 열고 SSH 공개 키를 게시하고 복제할 새 빈 프로젝트를 추가하기만 하면 됩니다.
Docker가 없으면 를 사용하면 작동합니다. Docker가 없으면 프로젝트 복제도 가능합니다.ssh -i C:\path\to\my\private_key\id_rsa [email protected]
Dockerfile에 개인 키를 로드하고 마지막에 삭제합니다. 중요하지는 않지만 보안 위험이 있는 모든 사람을 위해 클라이언트와 서버 모두에서 사용 후 바로 키 쌍을 삭제합니다. Dockerfile을 실행하는 동안에는 작동하지 않는 것처럼 보이고 로그에 비밀번호를 남길 수 있으므로 실제 보안 위험이 될 수 있기 때문에 복제할 때 사용자 계정의 비밀번호 입력을 피하려고 합니다.
시작: Dockerfile 디렉터리로 이동하여 개인 키 "id_rsa"를 새 ".ssh" 하위 폴더에 붙여넣습니다. 그 다음에:
docker build -t NEW_IMAGENAME . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)"
현재까지의 작업 코드:
FROM vcatechnology/linux-mint:18.2
ARG ssh_prv_key
RUN apt-get update && \
apt upgrade -y && \
apt-get install -y git
RUN apt-get install -y openssh-client # openssh-server
RUN mkdir /root/.ssh/
RUN echo "Host *\n User git\n HostName gitlab.com\n AddKeysToAgent yes\n IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
RUN ssh -o StrictHostKeyChecking=no [email protected] || true
RUN eval "$(ssh-agent -s)"
RUN chmod 666 /dev/tty
이는 다음과 같은 결과를 낳습니다:
docker build -t CONTAINERNAME . --build-arg ssh_prv_key="$(cat /.ssh/id_rsa)"
[+] Building 254.9s (14/17)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 6.84kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/vcatechnology/linux-mint:18.2 0.8s
=> CACHED [ 1/14] FROM docker.io/vcatechnology/linux-mint:18.2@sha256:0557a4999d43c0c622f3a57c3db5b13536024fb5999ecf4f03c6ffec0e4fdb47 0.0s
=> [ 2/14] RUN apt-get update && apt upgrade -y && apt-get install -y git 244.3s
=> [ 3/14] RUN apt-get install -y openssh-client # openssh-server 3.1s
=> [ 4/14] RUN mkdir /root/.ssh/ 0.6s
=> [ 5/14] RUN echo "Host *\n User git\n HostName gitlab.com\n AddKeysToAgent yes\n IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config 0.6s
=> [ 6/14] RUN echo "$(cat /.ssh/id_rsa)" > /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa 0.6s
=> [ 7/14] RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts 1.3s
=> [ 8/14] RUN ssh -o StrictHostKeyChecking=no [email protected] || true 1.6s
=> [ 9/14] RUN eval "$(ssh-agent -s)" 0.6s
=> [10/14] RUN chmod 666 /dev/tty 0.6s
Dockerfile에서 이 작업 코드 이후의 마지막 단계는 다음과 같지만 처음 세 줄은 각각 지금까지 스크립트를 중지합니다.
RUN ssh-add /root/.ssh/id_rsa
RUN ssh -tti /root/.ssh/id_rsa [email protected]
RUN git clone [email protected]:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh
RUN ssh-add /root/.ssh/id_rsa
마지막 작업 코드 바로 뒤에 오는 경우 :=> ERROR [11/14] RUN ssh-add /root/.ssh/id_rsa 0.6s ------ > [11/14] RUN ssh-add /root/.ssh/id_rsa: #14 0.579 Could not open a connection to your authentication agent. ------ executor failed running [/bin/sh -c ssh-add /root/.ssh/id_rsa]: exit code: 2
오류는 Could not open a connection to your authentication agent.
유명합니다.인증 에이전트에 대한 연결을 열 수 없습니다.. 하지만 그 스레드로는 문제를 해결할 수 없었습니다.
마지막 작업 코드 바로 뒤에 오는 경우 :
RUN ssh -tti /root/.ssh/id_rsa [email protected]
#14 1.545 Permission denied (publickey,keyboard-interactive). ------ executor failed running [/bin/sh -c ssh -tti /root/.ssh/id_rsa [email protected]]: exit code: 255
마지막 작업 코드 바로 뒤에 오는 경우 :
RUN git clone [email protected]:GITLAB_USERNAME/test.git
#16 0.450 Cloning into 'test'... #16 1.466 Permission denied (publickey,keyboard-interactive). #16 1.467 fatal: Could not read from remote repository. #16 1.467 #16 1.467 Please make sure you have the correct access rights #16 1.467 and the repository exists. ------ executor failed running [/bin/sh -c git clone [email protected]:GITLAB_USERNAME/test.git]: exit code: 128
따라서 ssh는 클라이언트의 개인 키를 전혀 알기 위해 "ssh-agent"에 개인 키를 추가하는 "ssh-add"가 분명히 필요하며 ssh가 서버에 대한 경로를 알 수 있도록 하기 위해서도 필요하다고 생각합니다. .ssh -tti /root/.ssh/id_rsa [email protected]
만약 (-T가 피한다면
RUN ssh -Tvvv [email protected]
stdin이 터미널이 아니기 때문에 의사 터미널은 할당되지 않습니다.)는 마지막 작업 코드 바로 뒤에 옵니다(최종 Dockerfile에서는 필요하지 않으며 단지 확인용일 뿐입니다).=> ERROR [12/12] RUN ssh -Tvvv [email protected] 1.2s ------ > [12/12] RUN ssh -Tvvv [email protected]: #16 0.376 OpenSSH_7.2p2 Ubuntu-4ubuntu2.10, OpenSSL 1.0.2g 1 Mar 2016 #16 0.376 debug1: Reading configuration data /etc/ssh/ssh_config #16 0.376 debug1: /etc/ssh/ssh_config line 19: Applying options for * #16 0.376 debug1: /etc/ssh/ssh_config line 57: Applying options for * #16 0.376 debug2: resolving "gitlab.com" port 22 #16 0.397 debug2: ssh_connect_direct: needpriv 0 #16 0.397 debug1: Connecting to gitlab.com [172.65.251.78] port 22. #16 0.450 debug1: Connection established. #16 0.450 debug1: permanently_set_uid: 0/0 #16 0.450 debug1: key_load_public: No such file or directory #16 0.450 debug1: identity file /root/.ssh/id_rsa type -1 #16 0.450 debug1: key_load_public: No such file or directory #16 0.450 debug1: identity file /root/.ssh/id_rsa-cert type -1 #16 0.451 debug1: Enabling compatibility mode for protocol 2.0 #16 0.451 debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10 #16 0.977 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.9p1 Debian-10+deb10u2 #16 0.977 debug1: match: OpenSSH_7.9p1 Debian-10+deb10u2 pat OpenSSH* compat 0x04000000 #16 0.977 debug2: fd 3 setting O_NONBLOCK #16 0.977 debug1: Authenticating to gitlab.com:22 as 'git' #16 0.977 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts" #16 0.977 debug3: send packet: type 20 #16 0.977 debug1: SSH2_MSG_KEXINIT sent #16 0.994 debug3: receive packet: type 20 #16 0.994 debug1: SSH2_MSG_KEXINIT received #16 0.994 debug2: local client KEXINIT proposal #16 0.994 debug2: KEX algorithms: [email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,ext-info-c #16 0.994 debug2: host key algorithms: [email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa #16 0.994 debug2: ciphers ctos: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc #16 0.994 debug2: ciphers stoc: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc #16 0.994 debug2: MACs ctos: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1 #16 0.994 debug2: MACs stoc: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1 #16 0.994 debug2: compression ctos: none,[email protected],zlib #16 0.994 debug2: compression stoc: none,[email protected],zlib #16 0.994 debug2: languages ctos: #16 0.994 debug2: languages stoc: #16 0.994 debug2: first_kex_follows 0 #16 0.994 debug2: reserved 0 #16 0.994 debug2: peer server KEXINIT proposal #16 0.994 debug2: KEX algorithms: curve25519-sha256,[email protected],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 #16 0.994 debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519 #16 0.994 debug2: ciphers ctos: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected] #16 0.994 debug2: ciphers stoc: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected] #16 0.994 debug2: MACs ctos: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1 #16 0.994 debug2: MACs stoc: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1 #16 0.994 debug2: compression ctos: none,[email protected] #16 0.994 debug2: compression stoc: none,[email protected] #16 0.994 debug2: languages ctos: #16 0.994 debug2: languages stoc: #16 0.994 debug2: first_kex_follows 0 #16 0.994 debug2: reserved 0 #16 0.994 debug1: kex: algorithm: [email protected] #16 0.994 debug1: kex: host key algorithm: ecdsa-sha2-nistp256 #16 0.994 debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none #16 0.994 debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none #16 1.014 debug3: send packet: type 30 #16 1.014 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY #16 1.182 debug3: receive packet: type 31 #16 1.185 debug1: Server host key: ecdsa-sha2-nistp256 SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw #16 1.186 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts" #16 1.187 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts" #16 1.187 debug1: read_passphrase: can't open /dev/tty: No such device or address #16 1.188 Host key verification failed. ------ executor failed running [/bin/sh -c ssh -Tvvv [email protected]]: exit code: 255
많은 노력을 했지만 지금까지 오류를 해결할 수 없었습니다 read_passphrase: can't open /dev/tty: No such device or address
. 파일이 존재합니다. 그렇지 않으면 chmod 666 /dev/tty
. 빈 비밀번호를 입력하기 위해서만 단말기가 필요한 것 같아요.
단 하나의 Dockerfile을 사용하여 비밀번호 없는 SSH 키 쌍을 사용하여 GitLab에서 저장소를 복제하려면 무엇을 변경해야 합니까?
하나의 Dockerfile에서만 이 작업을 수행할 수 없는 경우 허용되는 해결 방법은 docker-compose 파일입니다. 하지만 이것은 선호되는 대답은 아닙니다.
편집됨: 컨테이너를 조사하면 필요한 경로와 파일을 찾을 수 있습니다.
(The start was: docker build -t . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)", until the end of the working code only!)
docker run -d -it --name test_bash -d NEW_IMAGENAME:latest
docker exec -it test_bash bash
cd root/.ssh;ls
마지막 명령은 id_rsa 및 Known_hosts를 보여줍니다.
d3cbc35351fd / # cd root/.ssh;ls
id_rsa known_hosts
그리고 컨테이너 내부를 실행하면 비밀번호를 묻는 메시지가 표시됩니다.d3cbc35351fd .ssh # ssh -Tvvv [email protected]
Enter passphrase for key '/root/.ssh/id_rsa':
debug2: bad passphrase given, try again...
Enter passphrase for key '/root/.ssh/id_rsa':
debug2: bad passphrase given, try again...
Enter passphrase for key '/root/.ssh/id_rsa':
debug2: no passphrase given, try next key
이것은 "", ''를 사용해 시도한 것이며 Enter 키만 누르면 모두 작동하지 않습니다.
Dockerfile에서 SSH를 사용할 수 없고 해당 Dockerfile 이미지의 컨테이너에서도 SSH를 사용할 수 없는 경우 Dockerfile 또는 컨테이너에서 리포지토리를 복제하는 것이 가능한지 궁금합니다. 비밀번호 입력을 억제하는 것이 이 문제를 해결하는 다음 큰 단계가 될 것이라고 생각합니다. 그러나 컨테이너에 빈 비밀번호를 이미 입력하려고 시도했지만 아무 소용이 없었기 때문에 완전히 해결되지 않을 수도 있습니다.
답변1
보안상의 이유로 이미지의 개인 키를 제거하고 싶거나 추가 정보가 필요한 경우 다음을 참조하세요.Docker 컨테이너 내에서 SSH 키 사용좀 더 철저한 답변으로.
주요 오류는 다음으로 인해 발생합니다.
echo "$ssh_prv_key" > /root/.ssh/id_rsa
개인 키에는 여러 줄이 필요하지만 형식이 잘못된 ssh_prv_key를 한 줄로 전달합니다. 아이디어는 다음과 같습니다.docker 파일의 ssh-agent에 개인 키 추가그것은 암시한다Gitlab CI/Docker: ssh-add가 계속 암호 문구를 요청합니다..
--> 따라서 RUN echo ...
개인 키로 사용하지 말고 대신 COPY ...
!!! 을 사용하십시오.
또 다른 작은 오류는 작동하지 않지만RUN ssh -o StrictHostKeyChecking=no [email protected] || true
둘 다
RUN echo "Host *\n\t StrictHostKeyChecking no" >> /etc/ssh/ssh_config
그리고
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
동일한 목표를 달성하려면 둘 중 하나만 선택하세요.
ssh-agent
또 다른 단계는 및 를 삭제하는 것입니다 ssh-add
. 둘 다 필요한 경우에만 필요합니다.가지다비밀번호, 참조docker 파일의 ssh-agent에 개인 키 추가.
현재 작동 중입니다.
Dockerfile은 다음과 같습니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y git
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
COPY /.ssh/id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
RUN git clone [email protected]:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh
Dockerfile에서 이미지를 생성하려면 다음 안내를 따르세요.
Dockerfile의 디렉터리로 이동합니다.
개인 키 "id_rsa"(또는 갖고 있는 이름, 그런 다음 물론 코드 변경)를 새 하위 폴더 "/.ssh/"에 붙여넣습니다(또는 Dockerfile 디렉터리에 붙여넣고 코드를 로 변경합니다
COPY id_rsa /root/.ssh/id_rsa
).시작 ("."를 잊지 마세요. 마지막에는 빌드 컨텍스트입니다.):
docker build -t test .
답변2
ssh-agent는 빌드 프로세스에서 예상대로 작동하지 않지만 전혀 필요하지 않습니다.
작동하는 최소한의 샘플을 만듭니다.
FROM ubuntu:latest
ARG ssh_prv_key
RUN apt-get update \
&& apt-get install -y git
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa
# Check if the key was successfully copied
# RUN cat -n /root/.ssh/id_rsa
# Dummy ssh to store the host into known_hosts
# The expected output is something like:
# Hi <user>! You've successfully authenticated, but GitHub does not provide shell access.
RUN ssh -T -o StrictHostKeyChecking=no [email protected] || true
RUN git clone ssh://[email protected]/<myrepo>
답변3
read_passphrase: can't open /dev/tty: No such device or address
내 경우에는 ssh가 새 호스트를 추가하라는 권한을 요청하여 오류가 발생했습니다. 에 따라이 답변SSH 구성에 추가
StrictHostKeyChecking no
SSH 클라이언트가 지원하는 경우 보안 accept-new
대신 사용하십시오.no