programing

개인 git repo를 도커 파일로 복제

telecom 2023. 4. 20. 20:01
반응형

개인 git repo를 도커 파일로 복제

저는 이 코드를 다양한 도커 파일에서 복사했습니다.다음은 제 코드입니다.

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

도커파일을 처음 사용하는데, 제가 읽은 (및 작업 Configuration에서 가져온) 내용을 보면 왜 이것이 동작하지 않는지 알 수 없습니다.

제 id_rsa는 도커 파일과 같은 폴더에 있으며, 문제없이 복제할 수 있는 로컬 키 복사본입니다.

편집:

도커 파일에서 추가할 수 있는 기능:

RUN cat /root/.ssh/id_rsa

올바른 키를 출력하기 때문에 올바르게 복사되어 있는 것을 알 수 있습니다.

나도 노아의 조언대로 하려고 노력했고 도망쳤다.

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

이것 또한 슬프게도 효과가 없다.

키가 패스워드로 보호되어 문제의 원인이 되고 있습니다.작업중인 파일은 다음과 같습니다(향후 구글러에게 도움이 됩니다).

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 이미지에 포함시키고 싶지 않을 수 있으므로 해당 Docker 이미지에 대해 새 SSH 키 세트를 만들어야 합니다.작동시키려면 git 저장소의 배포 키에 키를 추가해야 합니다.다음은 완전한 레시피입니다.

  1. ssh " " 를 사용하여 합니다.ssh-keygen -q -t rsa -N '' -f repo-keyrepo-key pub repo-key . pub 。

  2. repo-key.pub을 사용하다
    、 [ your [ Settings ]-> [ Git 합니다.[저장소] -> [설정] -> [전개키] -> [전개키]를 허브로 합니다.

  3. 도커 파일에 다음과 같은 내용을 추가합니다.

    키 추가 /실행 \chmod 600 / repo-key & \「아이덴티티」를 메아리치다파일 /repo-key">> /etc/ssh/ssh_config & \echo - e "StrictHostKeyChecking no" >> /etc/ssh/ssh_config & \// 여기 git clone 명령어...
    

위에서는 StrictHostKeyChecking이 꺼지기 때문에 .ssh/known_hosts는 필요 없습니다.위의 답변 중 하나에서 ssh-keyscan을 사용하는 솔루션이 더 좋을 것 같습니다.

SSH 구성을 만지작거릴 필요가 없습니다.환경 변수가 포함된 구성 파일(도커 파일이 아님)을 사용하고 셸 스크립트에서 런타임에 도커 파일을 업데이트하도록 합니다.도커 파일에서 토큰을 사용하지 않고 https를 통해 복제할 수 있습니다(SSH 키를 생성하거나 전달할 필요 없음).

[ Settings ]> [ Personal Access Tokens ]으로 이동합니다.

  • " " 를 사용하여 합니다.repo유효하게 되어 있습니다.
  • 복제합니다.git clone https://MY_TOKEN@github.com/user-or-org/repo

일부 코멘트는 공유 Docker 파일을 사용하면 프로젝트의 다른 사용자에게 액세스 키가 노출될 수 있다는 점에 주목했습니다.특정 사용 사례에 대한 우려 사항일 수도 있고 아닐 수도 있지만, 다음과 같은 몇 가지 방법이 있습니다.

  • 키를 변수로 포함할 수 있는 인수를 받아들이려면 셸 스크립트를 사용합니다. 파일의 를 도커로 .sed 해서을 '어울리다', '어울리다', '어울리다', '어울리다', '어울리다'로 sh rundocker.sh MYTOKEN=foo은 「」로 됩니다.https://{{MY_TOKEN}}@github.com/user-or-org/repo컨피규레이션파일(.yml 형식 또는 원하는 형식)을 사용하여 환경변수에서 동일한 작업을 수행할 수도 있습니다.
  • 해당 프로젝트에 대해서만 github 사용자 생성(및 액세스 토큰 생성)

하지 것이 .git clone이 credential은 할 수 있는 할 수 있습니다.클론을 작성하려면 이미지 내에 개인 ssh 자격 정보를 배치해야 합니다.이 자격 정보는 나중에 이미지에 액세스할 수 있는 모든 사용자가 추출할 수 있습니다.

신, 、 반 rep 、 반 rep 、 rep rep 、 rep repooooooooooooo 。COPY이치노두 번째 장점은 도커 캐싱입니다.도커 캐싱은 실행 중인 명령어, 여기에 포함된 환경 변수, 입력 파일 등을 살펴보고 동일한 상위 단계의 이전 빌드와 동일한 경우 이전 캐시를 재사용합니다.git clone명령어 자체는 동일하기 때문에 외부 git repo가 변경되어도 도커는 캐시를 재사용합니다. a, a.COPY명령어는 빌드 컨텍스트에서 파일을 확인하여 파일이 동일한지 또는 업데이트되었는지 확인할 수 있으며 적절한 경우에만 캐시를 사용합니다.

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 .

이 경우에도 이미지 레이어에 기록되지 않고 빌드에 삽입되므로 실수로 자격 정보가 유출될 위험이 없습니다.


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 키를 패스워드로 보호해야 하지만 적어도 1단계로 빌드를 실행하여 COPY 명령어를 삭제하고 ssh credential이 이미지의 일부가 되지 않도록 할 수 있습니다.


빌드에 credential을 추가할 경우 다단계 빌드를 사용하여 이러한 credential을 태그가 부착되어 빌드 호스트 외부로 푸시되지 않는 초기 단계에만 배치하는 것이 좋습니다.결과는 다음과 같습니다.

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
...

도커에 강제적으로 실행되도록 하려면git clone이전 라인이 캐시된 경우에도 빌드마다 변경되는 빌드 AR을 삽입하여 캐시를 해제할 수 있습니다.이것은 다음과 같습니다.

# 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 .

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

투고에서 설명한 바와 같이, 당신은 클론을 얻기 위해 필요한 의존관계로 중간 이미지를 준비할 수 있습니다.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)

비트버킷 저장소의 경우 Repo 및 프로젝트에 대한 읽기 액세스 권한을 가진 App Password(비트버킷 설정 -> 액세스 관리 -> App Password, 이미지 참조)를 생성합니다.

비트버킷 사용자 메뉴

다음으로 사용하는 명령어는 다음과 같습니다.

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

이제 빌드킷 옵션을 사용할 수 있습니다.--ssh default컨테이너를 빌드할 때: 빌드하기 전에 SSH 전개 키를 ssh-agent에 추가해야 합니다.

첫 번째 단계부터의 전체 과정을 다음에 나타냅니다.

  1. 배포 서버에 키 쌍을 만듭니다. 뛰어!ssh-keygen -t ecdsa에 저장합니다.

  2. git 프로바이더 웹사이트(gitlab, github..)에서 생성된 공개키(.pub 확장자)를 추가합니다.

  3. ssh-agent(기본적으로 모든 파일을 처리하는 것보다 키를 쉽게 관리하는 프로그램)에 키를 추가합니다.

eval $(ssh-agent)
ssh-add /path/to/your/private/key
  1. Docker 파일에 추가합니다.
# this 3 first lines add your provider public keys to known_host 
# so git doesn't get an error from SSH.

RUN mkdir -m 700 /root/.ssh && \
  touch -m 600 /root/.ssh/known_hosts && \
  ssh-keyscan your-git-provider.com > /root/.ssh/known_hosts 


# now you can clone with --mount=type=ssh option, 
# forwarding to Docker your host ssh agent

RUN mkdir -p /wherever/you/want/to/clone && cd /wherever/you/want/to/clone && \
  --mount=type=ssh git clone git@gitlab.com:your-project.git
  1. 이제 Docker 파일을 빌드할 수 있습니다(빌드킷이 유효하게 되어 있습니다).
DOCKER_BUILDKIT=1 docker build . --ssh default

현재 도커 컴포지트에 내장하는 콘솔 파라미터를 전달할 수 없기 때문에 이 솔루션은 도커 컴포지트에 대해서는 아직 사용할 수 없지만 곧 사용할 수 있을 것입니다(github에서 실행되어 머지 요청으로 제안됨).

p.s. 이 솔루션은 빠르고 간단하지만 보안이 저하됩니다(@jrh의 코멘트 참조).


액세스 토큰을 만듭니다.https://github.com/settings/tokens

.를 합니다.CapRover , 합니다.App Configs)

도커 파일:

ARG GITHUB_TOKEN=${GITHUB_TOKEN}
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
RUN pip install -r requirements.txt

형식(p.s)이라고합니다. 이것은 개인 저장소가 다음 형식으로 되어 있는 것을 전제로 하고 있습니다.requirements.txt:

git+https://github.com/<YOUR-USERNAME>/<YOUR-REPO>.git

도 같은 .--ssh default 효과가 .

★★★★★★★★★★★★★★★★ @Calvin Froedge Access Token 토큰)을

때 '어울리지 않다'를 넣어야 할 요.oauth ★★★★★★★★★★★★★★★★★」oauth2다음과 같이 인증하기 전에 사용자 이름으로 지정합니다.

https://oauth:<token>@git-url.com/user/repo.git

최근 Rust 프로젝트의 개인 저장소에서 유사한 문제가 발생했습니다.ssh permissions/config를 모두 피하는 것이 좋습니다.

대신:

  1. 사용 권한이 이미 존재하는(또는 쉽게 구성할 수 있는) CI 등 빌드 환경 내의 저장소를 복제합니다.
  2. 파일을 Docker 파일에 복사합니다(CI 내에서 네이티브로 캐시할 수도 있습니다).

파트 1) CI 내

CARGO_HOME=tmp-home cargo fetch

파트 2) 도커 파일 내

COPY tmp-home $CARGO_HOME

언어/언어 시스템에 관계없이 프로세스는 동일하다

언급URL : https://stackoverflow.com/questions/23391839/clone-private-git-repo-with-dockerfile

반응형