dockerfile을 사용하여 개인 git repo 복제 over private key, and set permissions ADD

나는 여러 가지 작동하는 dockerfiles 인 것에서이 코드를 복사했습니다.

FROM ubuntu

MAINTAINER Luke Crooks "luke@pumalo.org"

# Update aptitude with new repo
RUN apt-get update

# Install software
RUN apt-get install -y git python-virtualenv

# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf

이것은 나에게 오류를 준다

Step 10 : RUN git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf
 ---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone git@bitbucket.org:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128

dockerfiles를 사용하는 것은 이번이 처음이지만, 내가 읽은 (그리고 작동하는 구성에서 가져온) 내용이 왜 작동하지 않는지 알 수 없습니다.

내 id_rsa는 내 dockerfile과 동일한 폴더에 있으며이 저장소를 문제없이 복제 할 수있는 로컬 키의 사본입니다.

편집하다:

내 dockerfile에서 다음을 추가 할 수 있습니다.

RUN cat /root/.ssh/id_rsa

그리고 올바른 키를 인쇄하므로 올바르게 복사되는 것을 알고 있습니다.

나는 또한 노아가 조언하고 실행 한대로 노력했습니다.

RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config

슬프게도 작동하지 않습니다.



답변

내 키는 비밀번호로 보호되어 문제를 일으켰습니다. 작업 파일이 아래에 나열되어 있습니다 (향후 Google 직원을 돕기 위해).

FROM ubuntu

MAINTAINER Luke Crooks "luke@pumalo.org"

# Update aptitude with new repo
RUN apt-get update

# Install software
RUN apt-get install -y git
# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Add bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git


답변

고유 한 개인 키를 포함하지 않으려는 경우 해당 Docker 이미지에 대해 새 SSH 키 세트를 작성해야합니다. 작동하려면 git 저장소의 배포 키에 해당 키를 추가해야합니다. 완전한 레시피는 다음과 같습니다.

  1. ssh-keygen -q -t rsa -N '' -f repo-keyrepo-key 및 repo-key.pub 파일을 제공하는 ssh 키를 생성 하십시오.

  2. 저장소 배치 키에 repo-key.pub를 추가하십시오.
    GitHub에서 [저장소]-> 설정-> 배포 키로 이동하십시오.

  3. Dockerfile에 다음과 같은 것을 추가하십시오.

    리포 키 추가 /
    운영 \
      chmod 600 / repo- 키 && \
      echo "IdentityFile / repo-key">> / etc / ssh / ssh_config && \
      echo -e "StrictHostKeyChecking no">> / etc / ssh / ssh_config && \
      // 여기 git clone 명령 ...
    

위의 StrictHostKeyChecking을 끄므로 .ssh / known_hosts가 필요하지 않습니다. 위의 답변 중 하나에서 ssh-keyscan을 사용하여 더 많은 솔루션을 원할 것입니다.


답변

ssh 구성으로 주위를 둘러 볼 필요가 없습니다. 환경 변수가 포함 된 구성 파일 (Dockerfile 아님)을 사용하고 런타임시 쉘 스크립트가 Docker 파일을 업데이트하도록합니다. Dockerfile에서 토큰을 보관하지 않고 https를 복제 할 수 있습니다 (ssh 키를 생성하거나 전달할 필요가 없음).

이동 설정> 개인 액세스 토큰

  • repo범위가 활성화 된 개인 액세스 토큰을 생성하십시오 .
  • 다음과 같이 복제하십시오. git clone https://MY_TOKEN@github.com/user-or-org/repo

일부 의견 제시 자들은 공유 Dockerfile을 사용하면 프로젝트의 다른 사람들에게 액세스 키가 노출 될 수 있다고 언급했습니다. 특정 사용 사례에서는 이것이 문제가 될 수도 있고 아닐 수도 있지만 다음과 같은 방법으로 처리 할 수 ​​있습니다.

  • 쉘 스크립트를 사용하여 키를 변수로 포함 할 수있는 인수를 승인하십시오. Dockerfile의 변수를 sed또는 이와 유사한 sh rundocker.sh MYTOKEN=foo것으로 바꾸십시오 (예 : on을 대체 할 스크립트 호출) https://{{MY_TOKEN}}@github.com/user-or-org/repo. 환경 변수와 동일한 작업을 수행하기 위해 구성 파일 (.yml 또는 원하는 형식)을 사용할 수도 있습니다.
  • 해당 프로젝트에 대해서만 github 사용자 생성 및 액세스 토큰 생성

답변

다른 옵션은 다단계 도커 빌드를 사용하여 SSH 키가 최종 이미지에 포함되지 않도록하는 것입니다.

게시물에 설명 된 것처럼 중간 이미지를 필요한 종속성으로 git clone 한 다음 COPY필요한 파일을 최종 이미지에 준비 할 수 있습니다 .

또한 LABEL중간 레이어 인 경우 완료되면 컴퓨터에서 레이어를 삭제할 수도 있습니다.

# Choose and name our temporary image.
FROM alpine as intermediate
# Add metadata identifying these images as our build containers (this will be useful later!)
LABEL stage=intermediate

# Take an SSH key as a build argument.
ARG SSH_KEY

# Install dependencies required to git clone.
RUN apk update && \
    apk add --update git && \
    apk add --update openssh

# 1. Create the SSH directory.
# 2. Populate the private key file.
# 3. Set the required permissions.
# 4. Add github to our list of known hosts for ssh.
RUN mkdir -p /root/.ssh/ && \
    echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod -R 600 /root/.ssh/ && \
    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Clone a repository (my website in this case)
RUN git clone git@github.com:janakerman/janakerman.git

# Choose the base image for our final image
FROM alpine

# Copy across the files from our `intermediate` container
RUN mkdir files
COPY --from=intermediate /janakerman/README.md /files/README.md

그런 다음 다음을 구축 할 수 있습니다.

MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .

SSH 키가 사라 졌음을 증명하십시오.

docker run -ti --rm clone-example cat /root/.ssh/id_rsa

빌드 머신에서 중간 이미지를 청소하십시오.

docker rmi -f $(docker images -q --filter label=stage=intermediate)


답변

비트 버킷 리포지토리의 경우 리포지토리 및 프로젝트에 대한 읽기 액세스 권한으로 앱 비밀번호 (Bitbucket 설정-> 액세스 관리-> 앱 비밀번호, 이미지 참조)를 생성하십시오.

비트 버킷 사용자 메뉴

그런 다음 사용해야하는 명령은 다음과 같습니다.

git clone https://username:generated_password@bitbucket.org/reponame/projectname.git


답변

git clone도커 빌드 내에서 개인 리포지토리 를 수행하고 싶지 않은 경우가 종종 있습니다. 복제를 수행하면 이미지에 비공개 ssh 자격 증명을 배치하여 나중에 이미지에 액세스 할 수있는 사람이 추출 할 수 있습니다.

대신 일반적인 CI 도구는 선택한 CI 도구의 도커 외부에서 git repo를 복제하고 단순히 COPY파일을 이미지 에 복제하는 것 입니다. 도커 캐싱이라는 두 번째 이점이 있습니다. Docker 캐싱은 실행중인 명령, 포함 된 환경 변수, 입력 파일 등을보고 동일한 상위 단계의 이전 빌드와 동일한 경우 해당 이전 캐시를 재사용합니다. A의 git clone고정 표시기 외부 자식 REPO 변경 되더라도 캐시를 재사용 할 수 있도록 명령을 명령 자체는 동일하다. 그러나 COPY명령은 빌드 컨텍스트에서 파일을보고 파일이 동일하거나 업데이트되었는지 확인할 수 있으며 적절한 경우에만 캐시를 사용합니다.


빌드에 신임 정보를 추가하려는 경우, 다단계 빌드로 수행하고 빌드 호스트 외부로 태그가 지정되지 않은 초기 단계에만 해당 신임 정보를 배치하십시오. 결과는 다음과 같습니다.

FROM ubuntu as clone

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa

# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git

FROM ubuntu as release
LABEL maintainer="Luke Crooks <luke@pumalo.org>"

COPY --from=clone /repo /repo
...

가장 최근에 BuildKit은 이미지에 쓰지 않는 마운트로 ssh 키를 전달할 수있는 몇 가지 실험 기능을 테스트했습니다.

# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git

# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
    git clone git@bitbucket.org:User/repo.git

그리고 당신은 그것을 가지고 만들 수 있습니다 :

$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
  --secret id=ssh_id,src=$(pwd)/id_rsa .

이를 위해서는 여전히 ssh 키가 비밀번호로 보호되어 있지 않아야하지만 최소한 단일 단계에서 빌드를 실행하여 COPY 명령을 제거하고 ssh 자격 증명이 이미지의 일부가되는 것을 피할 수 있습니다.


BuildKit은 또한 ssh 전용 기능을 추가하여 비밀번호로 보호 된 ssh 키를 계속 사용할 수있게했으며 결과는 다음과 같습니다.

# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git

# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN --mount=type=ssh \
    git clone git@bitbucket.org:User/repo.git

그리고 당신은 그것을 가지고 만들 수 있습니다 :

$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
  --ssh default=$SSH_AUTH_SOCK .

다시 이미지 레이어에 쓰지 않고 빌드에 주입되어 자격 증명이 실수로 유출 될 위험을 제거합니다.


git clone이전 행이 캐시 된 경우에도도 커가 강제로 실행되도록하려면 각 빌드마다 변경되는 빌드 ARG를 삽입하여 캐시를 해제 할 수 있습니다. 다음과 같습니다.

# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git

그런 다음 docker build 명령에 변경 arg를 주입하십시오.

date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .


답변

위의 솔루션은 비트 버킷에서 작동하지 않았습니다. 나는 이것이 트릭을 수행한다고 생각했다.

RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \
    && eval `ssh-agent` \
    && ssh-add ~/.ssh/[key] \
    && git clone git@bitbucket.org:[team]/[repo].git