Common Lisp REPL에서 docker 명령 실행
5332 단어 commonlisplispdockerproductivity
나는 기본적으로 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-virtualbox
는 vboxmanage
명령을 호출하여 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를 실행하고 관리하는 것이 작업을 완료하는 쉬운 방법인 것 같습니다. 그러나 그것은 일을 하는 깨끗하고 확장 가능한 방법이 아닙니다. 기본적으로 우리는 운영 체제 명령줄 기능을 사용하여 도커와 인터페이스하고 있습니다. 적절한 출력, 오류 정보 및 NIL
및 0
와 같은 불필요한 출력을 캡처하는 데 여전히 문제가 있습니다. 실제로는 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를 통해 버그 수정, 개선 사항 및 기능 요청을 제기할 수도 있습니다.
Reference
이 문제에 관하여(Common Lisp REPL에서 docker 명령 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/rajasegar/running-docker-commands-from-common-lisp-repls-350p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
(ql:quickload :cl-docker)
;; 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
curl --unix-socket /var/run/docker.sock http://localhost/v1.41/containers/json
Reference
이 문제에 관하여(Common Lisp REPL에서 docker 명령 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rajasegar/running-docker-commands-from-common-lisp-repls-350p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)