도커 이미지를 만들 때, 호스트에 있는 파일을 복사하는 게 가장 일반적이겠지만, CI툴에서 이미지 빌드를 한다거나, 특정한 브랜치를 항상 빌드한다거나 하는 특정한 경우에 Docker Image를 만드는 중에 소스코드를 클론 하는 경우가 있습니다.
이럴 때는 Dockerfile에 아이디와 패스워드를 노출할 수는 없기에, 제가 사용한 방식은 리파지토리에 등록된 Deploy Key를 이용하여 클론 한 후에 이미지에서 제거하는 방법을 사용했습니다. Dockerfile 코드는 다음과 같은 형식입니다.
FROM ubuntu:latest
COPY ssh_key /home/bitlog/.ssh/id_rsa
RUN git clone git@github.com:bitlog/dev-repository.git
RUN rm /home/bitlog/.ssh/id_rsa
언제나 그렇드시 순탄하게 실행이 되지는 않습니다. ssh를 이용하여 처음 클론을 받게 되면 host의 정보를 묻고, 그 host의 정보를 저장하는 단계를 거치게 되는데요. 단순히 예/아니요를 묻는 것이지만 Docker 이미지를 만드는 중에는 그런 프롬프트를 사용할 수 없으므로, Docker 이미지를 만드는 데는 실패하게 됩니다.
비슷한 경우가 있는데, 우분투 패키지를 설치하기 위해서 apt-get install 같은 명령을 Dockerfile에 기재할 때는 그런 확인용 응답에 대해서 무조건 y로 응답하는 옵션을 적어줍니다.
RUN apt-get update && apt-get install -y \
git \
openjdk-11-jdk \
첫 줄의 마지막에 옵션으로 -y 옵션이 있는 것을 많이 보셨을 겁니다. git clone에는 그런 옵션이 없습니다. ssh 프로토콜을 이용한 클론이기 때문에 ssh 옵션을 변경해 주어야 하고 ssh_config 파일을 수정해 줘야 하기에 Dockerfile에서 하기는 조금 귀찮습니다.
# ssh_config
Host *
StrictHostKeyChecking no
위와 같은 파일을 만들어 /etc/ssh/ssh_config 파일로 바꾸는 방법입니다. 그리고 이제까지 이렇게 해오고 있었습니다.
오늘 비슷한 일이 있어서, clone을 하던 중 오류가 나길래, 설정하는 방법을 찾다 보니 더 간단한 방법을 찾았습니다.
git 2.10 버전에서 생긴 옵션이라고 하는데, core.sshCommand라는 옵션이고 ssh 명령을 실행할 때 자동으로 환경 변수를 추가하는 기능입니다. 그래서 다음과 같이 실행할 때, 한 줄을 더 적어주면 host key를 추가할 것이냐 묻지 않고 진행하게 되는 것이죠.
RUN git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StricHostKeyChecking=no'
이렇게 설정을 추가해주고 나면 정상적으로 빌드된 이미지를 얻을 수 있습니다. 파일을 추가하는 거보다 간단해졌죠?
끝