jenkins를 활용하여 elasticsearch를 컨테이너로 배포하기 위한 데모를 만들던 도중 발생했던 문제에 대해 적어보려고 합니다. docker plugin 없이 docker.sock를 활용하여 docker outer docker 환경으로 쓰시는 분들께 도움이 되었으며 합니다.(머리가모자라서 몸이 힘드네요)
문제 내용을 다루기 전 상황에 대해 말씀을 드리고 가려고 합니다.
local 컴퓨팅 환경에서 여러 app들이 설치되었을 때 의존성에 의한 패키지 충돌 발생을 염두하여 데모용으로 제공되는 모든 서비스를 컨테이너로 생성하기로 계획하였습니다. 이에 따라 ‘Docker Out of Docker’ 즉 jenkins(container)가 local 컴퓨터에 설치된 docker.sock을 통해 continaer를 생성하게 됩니다.
jenkins pipeline을 통해 ‘git clone’ 과정 이후 컨테이너를 생성할 때 발생됩니다
컨테이너 생성 시 yaml 파일에 명시된 내용을 바탕으로 docker.sock에 전달되어 컨테이너 생성이 이루어지게 됩니다.
이때 아래와 같은 yaml 파일 내용이 존재할 때 volume을 마운트 하기 위해 $PWD/config/elasticsearch.yml
path를 로컬 컴퓨터에서 찾게 됩니다. 하지만 pipeline을 통해 clone 받은 project repo의 폴더는 jenkins 컨테이너 내부에 생성됨에 따라 docker.sock이 local 컴퓨터 path에서는 찾지 못하는 문제가 발생합니다.
version: '3.8'
services:
elasticsearch_sigle_node:
...
...
...
volumes:
# 문제가 되는 부분!
- $PWD/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- $PWD/config/jvm.options:/usr/share/elasticsearch/config/jvm.options
해당 문제를 아래와 같은 순서로 해결 하였습니다.
오늘 작성한 내용은 docker out docker의 아키텍처에서 발생하는 문제인데요 jenkins 뿐만 아닌 여러 상황에서도 충분히 발생할 수 있는 문제라 생각하여 공유하게 되었습니다.
해당 정보가 읽는 분들께 도움이 되시길 바랍니다! 또한 포트폴리오를 위한 데모 구성을 진행하면서 발생하는 문제들을 정리하며 올리도록 하겠습니다!