-
[Docker] Docker API를 활용한 도커 이미지 빌드하기Docker 2021. 6. 3. 23:37728x90
배경상황:
AWS EC2 인스턴스에서 docker 컨테이너 실행 후 bash로 들어가서 Dockerfile을 작성함.
이 Dockerfile을 가지고 도커 이미지를 빌드하고 ECR에 올린 다음 ECS로 컨테이너를 실행하는 것이 최종 목표.
docker 컨테이너 안에서 이미지 빌드/컨테이너 실행은 docker-in-docker 형태로 가능함.
몇 가지 방법이 있는데
1. docker socket을 활용한 bind mount
2. docker in docker인 dind
또는
3. docker 컨테이너 안에서 docker 수동 설치하기
4. docker 컨테이너를 실행한 이미지 빌드용 Dockerfile에 도커 설치 명령어 추가하기
그러나 1,2,4번의 경우 기존에 작성된 Dockerfile이 없기 때문에 코드를 수정하지 못한다는 문제점이 있었고
3번의 경우 자동화를 지향하는 개발자스러움에 반하기 때문에!
찾아낸 방법은.... Docker API!
아래 공식문서를 참고해서 도커 이미지를 빌드했던 삽질일기를 공유합니다.
https://docs.docker.com/engine/api/v1.41/#operation/ImageBuild
* 공식문서 불친절 주의
- 요청 API가 틀렸을 때 나오는 에러메세지
$ curl --unix-socket /var/run/docker.sock http://localhost/build
{"message":"page not found"}
=> 공식문서에서 알려준대로 POST를 붙여서 다시 요청을 보내봅니다.
- Dockerfile을 찾지 못해서 나오는 에러메세지
$ curl -X POST --unix-socket /var/run/docker.sock http://localhost/build
{"message":"Cannot locate specified Dockerfile: Dockerfile"}
=> Docker API로 이미지를 빌드할 때는 Dockerfile을 압축해줘야 합니다.
https://stackoverflow.com/questions/43800339/how-to-build-an-image-using-docker-api
- Dockerfile tar파일로 압축하기
$ tar -cvf Dockerfile.tar.gz Dockerfile
- Dockerfile tar파일로 이미지 Build하기
$ curl -X POST -H "Content-Type:application/tar" --data-binary '@Dockerfile.tar.gz' --unix-socket /var/run/docker.sock http://localhost/build
curl -X POST : API 요청 시 POST로 요청하기
-H "Content-Type:application/tar" : content 타입은 압축한 tar
--data-binary '@Dockerfile.tar.gz' : Dockerfile 압축 파일을 이미지 빌드 시 활용하기
--unix-socket : 호스트 도커 컨테이너와 통신하기 위한 socket
/var/run/docker.sock : docker 컨테이너 실행 시 자동생성되는 docker socket 경로(컨테이너 내부 접속 bash 명령어로 확인 가능)
http://localhost/build : localhost 주소 뒤에 build를 포함하는 이미지 빌드 API
?t=img_name:123 : build뒤에 ?t= '이미지 이름:태그' 추가
- 이상 오늘의 삽질일기 끝!
여기저기 삽질도 해보고
날려도 먹으면서
배우는 게
결국 남는거다
- Z.Sabziller
'Docker' 카테고리의 다른 글
[Docker] EXPORT vs ARG vs ENV 환경변수 생성 명령어 비교 (0) 2021.06.23 [Docker] Image build 자동화를 위한 Shell Script 작성하기 (0) 2021.06.11 [Docker] Dockerfile 도커파일 이미지 빌드 시 환경변수 전달 방법(Feat. ARG, ENV) (0) 2021.05.19 [Docker] 도커 기본 명령어 모음 (0) 2021.05.16 [Docker] docker 도커 실행 오류 및 재시작 해결 방법 (0) 2021.05.13