Docker shell 바로 가기 - 전체 명령을 작성하기가 어렵기 때문입니다!

오락과 이윤의 용기!


그래서 너는 지금 정식으로 Docker와containers에 흥분하고 있다.
좋다소프트웨어에 휴대용 구성을 작성하고 여러 장치에서 원활하게 작동할 수 있도록 하는 훌륭한 도구입니다.
단, 만약 당신이 그들 곁에 충분한 시간을 머물렀다면, 당신은 Docker engine's CLI (명령행 인터페이스) 을 자주 사용할 수 있습니다.
명령은 다음과 같습니다.
docker exec -ti 1x81hs72k2s9 /bin/bash
또는
docker start container-name
아마도 너의 셸 역사에 있을 것이다.
나도 같은 문제가 있어서 작은 변경을 해서 천천히 확장된 유용한 코드 라이브러리에 업로드했습니다. (원한다면 이 라이브러리를 완전히 시작할 수 있습니다:)

톰 그라노 / 유용한 코드 세그먼트


시간의 추이에 따라 내가 만든 / 발견한 유용한 것


유용한 코드 세그먼트


시간 순서대로 추가합니다. 여기에 유용한 물건들이 저장되어 있습니다. 지속성:
  • Base64 인코딩된 플래그 이미지(JSON으로!) -link
  • 더 나은 Docker 환경을 위한 셸 코드 세션-link
  • View on GitHub

    통화 시간


    구체적으로 here으로 이동하면 다음 코드 세션을 볼 수 있습니다.
    #!/bin/bash
    
    # Get container id of existing container
    dgrep(){
        docker ps -a | grep "$1" | cut -c1-12
    }
    
    # bash into an existing container
    dbash() {
        docker exec -ti $(dgrep "$1") /bin/bash
    }
    
    # sh into an existing container
    dsh() {
        docker exec -ti $(dgrep "$1") /bin/sh
    }
    
    # Execute something in an existing container
    dex() {
        docker exec -ti $(dgrep "$1") $2
    }
    
    # Start an existing container
    dstart(){
        docker start $(dgrep "$1")
    }
    
    # Stop an existing container
    dstop(){
        docker stop $(dgrep "$1")
    }
    
    # Remove an existing container
    drm(){
        docker rm $(dgrep "$1")
    }
    
    # Stop and remove an existing container
    dsrm(){
        dstop $(dgrep "$1") && drm $(dgrep "$1")
    }
    
    # Remove an existing image
    dirm(){
        docker image remove $(dgrep "$1")
    }
    
    # Get logs of an existing container
    dlog(){
        docker logs $(dgrep "$1")
    }
    
    이 파일들은 셸의 프로필에 있습니다. 만약에 Linux 버전과 오래된 Mac 컴퓨터를 사용한다면 ~/.bashrc에 있고, 최신 Mac 컴퓨터를 사용한다면 ~/.zshrc에 있을 수 있습니다.
    이 명령을 셸 프로필에 넣으면 셸을 시작할 때 일반적인 셸 명령처럼 세션에서 사용할 수 있습니다.

    셸은 명령 별칭으로 사용됩니다.


    주의, 내가 이전에 한 것은 특정 명령을 실행하는 셸 함수를 정의하고 일반적인 셸 명령처럼 매개 변수를 받아들이는 것이다.
    이것은 셸 별명을 정의하는 것과 달리 Nick Taylor(대부분의 경우)가 한 것처럼 매개 변수를 별명에 전달할 수 있도록 합니다.
    이건 좀 심하다.이전에 정의한 dgrep 함수를 예로 들겠습니다.
    # Get container id of existing container
    dgrep() {
        docker ps -a | grep "$1" | cut -c1-12
    }
    
    dgrep()은 셸 함수로 무한량의 매개 변수를 받아들인다 (셸 함수와 같다).함수체에 제공된 함수에 접근하기 위해 우리는 $X 표현법을 사용하는데 그 중에서 X은 정수이다.$0은 항상 실행 중인 명령의 이름을 가리키므로 실행 중인 경우:
    my-command first-tom second-tom
    
    my-command
    my-command() {
        echo $0;
        echo $1;
        echo $2;
    }
    
    다음과 같이 출력합니다.
    my-command
    1
    2
    
    dgrep 명령으로 돌아가기
    # Get container id of existing container
    dgrep() {
        docker ps -a | grep "$1" | cut -c1-12
    }
    
    docker ps 의 내용 (즉 실행 중인 모든 용기의 목록) 을 가져온 다음 입력을 으로 되돌려줍니다. 이것은 제공된 매개 변수가 있는 검색 텍스트와 일치합니다.
    우리의 예에서, 이것은 $1의'grepping'입니다. 이것은 dgrep에 제공된 첫 번째 매개 변수입니다.마지막으로 출력 파이핑을 cut -c1-12으로 전송하여 파이핑 텍스트의 처음 12자(공교롭게도 Docker 컨테이너 ID의 길이)를 가져옵니다.
    예를 들어, 달리기를 하고 있는 경우:
    dgrep tom-container
    
    그리고 tom-container이 실행 중인 용기라면 docker ps은 Docker 엔진에 대한 모든 정보를 포함하는 문자열을 되돌려줍니다.
    그런 다음 dgrep 은 파이프를 통해 cut 명령으로 전송되며 컨테이너의 컨테이너 ID만 인쇄됩니다.

    그런데 내가 왜 필요해?


    좋은 질문.본고의 시작 예시를 기억하십니까? 우리는 온전한 용기 ID를 사용하여 용기를 표시합니까?
    docker exec -ti 1x81hs72k2s9 /bin/bash
    
    컨테이너의 전체 이름이나 ID를 기억하기를 원하는 사람은 없습니다.이제 명령은 다음과 같이 다시 쓸 수 있습니다.
    docker exec -ti $(dgrep substring-in-container-name) /bin/bash
    
    그 중에서 $()subshell-에 제공된 모든 내용을 실행하고 명령의 나머지 부분을 실행하기 전에 텍스트 형식으로 출력합니다.
    우리의 예에서 $(dgrep substring-in-container-name)은 이름의 하위 문자열(예를 들어 mymy-very-long-and-hard-to-remember-container-name)에 따라 용기 ID를 찾아서 docker exec -ti CONTAINER-ID /bin/bash으로 CONTAINER-ID 명령에 전달합니다.

    잠깐만, 그래도 좀 길어...


    네 말이 맞다!'맹격'한 용기(즉 이 용기 안에서 상호작용으로 bash을 운행하는 것은 기본적으로 이 용기에 단말기를 열어 놓는 것)는 우리가 자주 하는 일이다. 장시간 운행하는 용기를 디버깅하고 다른 재미있는 파일 시스템 악작극(ask me about that if you'd like to know more!)을 하는 것이다.dbash() 입력:
    # bash into an existing container
    dbash() {
        docker exec -ti $(dgrep "$1") /bin/bash
    }
    
    보시다시피, dbash은 하위 셸에서 앞에서 언급한 dgrep을 호출하고, dbash에 제공된 파라미터를 이 하위 셸, 즉 관련 용기의 하위 문자열에 전달합니다.
    이것은 결국 우리로 하여금 다음과 같은 일을 할 수 있게 한다.
    dbash tom
    
    실행 중인 용기 목록의 첫 번째 용기에 터미널을 연결합니다. 이 용기의 인간 읽을 수 있는 이름은 tom입니다.
    깔끔하죠?

    결론


    용기가 재미있어요.케이스를 사용해도 그렇습니다!
    실제로 나는 방금 Docker로 나와 나의 친한 친구인 Federico가 합작한 open-source project에 대해 매우 좋은 해커 공격을 했다.용기 마법을 좋아한다면 마음대로 보세요!

    방주


    관찰력이 있는 독자들은 Docker command formatting을 사용하면 파이프 하나를 절약할 수 있다는 것을 알아차릴 것이다.그 독자는 정확하지만 나는 나의 문법이 더욱 간단하고 초보자에게 설명하기 쉽다고 생각하기 때문에 나는 이 강좌에서 그것을 계속 사용한다(솔직히 말하면 나의 ~/.zshrc도 마찬가지이다).

    좋은 웹페이지 즐겨찾기