Docker shell 바로 가기 - 전체 명령을 작성하기가 어렵기 때문입니다!
오락과 이윤의 용기!
그래서 너는 지금 정식으로 Docker와containers에 흥분하고 있다.
좋다소프트웨어에 휴대용 구성을 작성하고 여러 장치에서 원활하게 작동할 수 있도록 하는 훌륭한 도구입니다.
단, 만약 당신이 그들 곁에 충분한 시간을 머물렀다면, 당신은 Docker engine's CLI (명령행 인터페이스) 을 자주 사용할 수 있습니다.
명령은 다음과 같습니다.
docker exec -ti 1x81hs72k2s9 /bin/bash
또는docker start container-name
아마도 너의 셸 역사에 있을 것이다.나도 같은 문제가 있어서 작은 변경을 해서 천천히 확장된 유용한 코드 라이브러리에 업로드했습니다. (원한다면 이 라이브러리를 완전히 시작할 수 있습니다:)
톰 그라노 / 유용한 코드 세그먼트
시간의 추이에 따라 내가 만든 / 발견한 유용한 것
유용한 코드 세그먼트
시간 순서대로 추가합니다. 여기에 유용한 물건들이 저장되어 있습니다. 지속성:
통화 시간
구체적으로 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)
은 이름의 하위 문자열(예를 들어 my
의 my-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
도 마찬가지이다).
Reference
이 문제에 관하여(Docker shell 바로 가기 - 전체 명령을 작성하기가 어렵기 때문입니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tomgranot/docker-shell-shortcuts-because-writing-full-commands-is-hard-33h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)