Common Lisp REPL에서 docker 명령 실행

이 게시물에서는 Common Lisp에서 도커 명령을 실행하는 방법을 살펴보겠습니다. 최근에 저는 Docker에서 Common Lisp 개발을 탐색하고 있습니다. 그래서 자주 터미널에서 도커 명령을 실행해야 합니다.

나는 기본적으로 SLIME 자체 내에서 도커 명령을 실행하는 방법을 찾고 있었습니다. 그런 다음 uiop:run-program에서 Common Lisp Cookbook 함수를 발견했습니다.
uiop:run-program 동기식 외부 하위 프로세스로 프로그램을 완전히 이식 가능하게 실행합니다.

따라서 SLIME 또는 Lisp REPL의 모든 Docker 컨테이너를 나열하려면 다음과 같이 run-program 함수를 호출해야 합니다.

(uiop:run-program "docker ps -a" :output t)


명령 결과를 표준 출력으로 인쇄하려면 :output t 인수를 제공해야 합니다.

결과는 다음과 같습니다.

CL-USER> (uiop:run-program "docker ps -a" :output t)
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS                  PORTS     NAMES
673b20976166   docker101tutorial   "/docker-entrypoint.…"   19 months ago   Exited (0) 4 days ago             docker-tutorial
NIL
NIL
0


cl-도커


uiop:run-program를 사용하여 도커 명령을 매번 실행하고 출력을 표준 출력으로 인쇄하는 모든 옵션을 전달하는 것은 시간이 많이 걸리고 Lispy가 아닌 방식으로 작업을 수행하는 것처럼 느껴졌습니다.

Lisp를 사용하여 보다 자연스러운 방식으로 도커 명령을 실행하고 싶었기 때문에 이를 위한 패키지를 작성할 계획이었습니다. 이 아이디어에 대한 최초의 영감은 cl-virtualbox by Fernando Borretti 이라는 또 다른 Common Lisp 패키지에서 나왔습니다. cl-virtualboxvboxmanage 명령을 호출하여 Common Lisp에서 VirtualBox를 제어할 수 있게 해주는 라이브러리입니다.

따라서 cl-docker이라는 새 패키지를 사용하면 docker 명령을 호출하여 Common Lisp에서 Docker를 제어할 수 있습니다.



설치




(ql:quickload :cl-docker)


용법



이제 머신의 모든 Docker 컨테이너를 나열하려면 REPL에서 아래 함수를 호출하면 됩니다.

;; List all docker containers
(docker:ps :a)


산출:




"CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS                    PORTS     NAMES
673b20976166   docker101tutorial   \"/docker-entrypoint.…\"   19 months ago   Exited (0) 16 hours ago             docker-tutorial
"
NIL
0


다음은 몇 가지 docker 명령 및 해당cl-docker 기능입니다.


도커 명령
cl-도커


도커 ps -a
(도커:ps :a)

도커 이미지
(도커:이미지)

도커 빌드 디렉토리
(도커:빌드 "myimage")

docker rm 컨테이너
(도커:rm "웹")

도커 시작 컨테이너
(도커:"웹"시작)

도커 중지 컨테이너
(도커:"웹"중지)


더 완전한 명령 목록은 프로젝트에서 볼 수 있습니다README.

uiop:run-program에서 벗어나기


uiop:run-program를 사용하여 Common Lisp에서 docker를 실행하고 관리하는 것이 작업을 완료하는 쉬운 방법인 것 같습니다. 그러나 그것은 일을 하는 깨끗하고 확장 가능한 방법이 아닙니다. 기본적으로 우리는 운영 체제 명령줄 기능을 사용하여 도커와 인터페이스하고 있습니다. 적절한 출력, 오류 정보 및 NIL0 와 같은 불필요한 출력을 캡처하는 데 여전히 문제가 있습니다. 실제로는 uiop:run-program 로 실행하는 명령에 대한 함수 반환 값 및 반환 코드입니다.

그렇다면 이러한 문제를 어떻게 해결할 수 있을까요? Common Lisp에서 도커를 올바르게 관리하는 가장 좋은 방법은 Docker Engine SDKs을 사용하는 것입니다.

Docker는 Docker 데몬(Docker Engine API라고 함)과 상호 작용하기 위한 API와 Go 및 Python용 SDK를 제공합니다. 현재 Common Lisp에 사용할 수 있는 사전 빌드된 SDK가 없습니다.

SDK를 사용하면 Docker 앱과 솔루션을 빠르고 쉽게 빌드하고 확장할 수 있습니다. 따라서 Common Lisp의 경우 Docker Engine API를 직접 사용해야 합니다.

Docker 엔진 API는 wget 또는 curl과 같은 HTTP 클라이언트 또는 대부분의 최신 프로그래밍 언어의 일부인 HTTP 라이브러리에서 액세스하는 RESTful API입니다.
docker ps 를 사용하는 것처럼 SDK API를 사용하여 컨테이너 목록을 가져오려면 다음과 같이 curl 요청을 보내야 합니다.

curl --unix-socket /var/run/docker.sock http://localhost/v1.41/containers/json


우리가 알아내야 할 것은 Unix 소켓을 사용하는 HTTP 클라이언트 라이브러리를 사용하여 Common Lisp에서 이 curl 요청을 복제하는 방법입니다. 그것이 내가 지금 알아 내려고 노력하는 것입니다. 아이디어가 있으시면 댓글로 알려주세요.
cl-docker는 아직 개발 초기 단계에 있습니다. 제공할 수 있는 모든 옵션으로 모든 docker 명령을 다루지 않았을 수 있습니다. 따라서 패키지를 사용해 보시고 의견 섹션에서 질문/피드백이 있으면 알려주십시오. Githubissues를 통해 버그 수정, 개선 사항 및 기능 요청을 제기할 수도 있습니다.

좋은 웹페이지 즐겨찾기