2017-03-01 1 views
0

나는 이것이 이상하게 들리는 것을 알고있다. 그러나 여기에있는 것이있다. 데이터베이스를 호스팅하는 도커 컨테이너가 있습니다. 그리고 스크립트 하나 하나를 하나씩 실행하려고하는 스크립트가 있습니다. 이제 스크립트는 데이터베이스 포트를 알지 못합니다 (컨테이너가 다른 포트에 바인드 할 때마다).왜 bash 스크립트가 터미널 창 크기에 따라 작동합니까?

#!bin/bash 

echo "Calculating the port..." 
port=$(docker-compose ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") 
echo "Port is $port" 

기본적으로는 고정 표시기-작성 PS의 출력에 대응하기로했다,이 같은 출력 :

 Name      Command    State   Ports   
wildfly_database-docker_1 docker-entrypoint.sh mysqld Up  0.0.0.0:32768->3306/tcp 

을하지만, 여기에 일이 그래서 여기에 스크립트의 시작입니다. 터미널 창 크기가 작 으면이 스크립트가 작동하지 않고 포트 변수는 비어 있습니다. 터미널 창을 전체 화면으로 확장하면 제대로 작동하고 필요한 것을 수행합니다. 첫 번째 경우의 출력이 여러 줄로 나뉘며 올바르게 파싱되지 않기 때문입니다.

그래서 bash 스크립트를 창 크기와 독립적으로 작동시키는 방법은 무엇입니까?

UPD. 나는 그 해답 덕분에 해결책을 발견했다. 이것은 docker-compose의 문제인 것처럼 보입니다. 하지만이 라인으로 바꾼 후에

port=$(docker ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") 

모든 것이 잘 동작합니다. Docker 자체는 터미널 크기의 영향을받지 않습니다.

+2

https://github.com/docker/compose/issues/1513 – muru

+0

@muru, 고마워요. 내 버전의 고정 장치가 해당 버그의 영향을 받았지만 docker 자체는 스크립트를 변경 했으므로 이제는 큰 효과가 있습니다 –

+0

@muru, 팁 주셔서 감사합니다. 답변으로 추가했습니다 –

답변

2

의견 덕분에 해결책을 찾았습니다. 이것은 docker-compose의 문제인 것처럼 보입니다. 하지만이 라인으로 바꾼 후에

port=$(docker ps | grep database-docker | sed "s/.*://g" | sed "s/\-.*//") 

모든 것이 잘 동작합니다. Docker 자체는 터미널 크기의 영향을받지 않습니다.

0

docker ps은 너무 넓은 출력을 억제하지 않으려면 --no-trunc 옵션이 있지만 처음에는 넓은 출력을 생성하지 않는 경우 필요하지 않습니다.

간단히 기계가 읽을 수있는 출력을위한 내장 기능을 사용하여 useless grep 등을 피하십시오.

docker ps --filter "name=database-docker" --format '{{.Ports}}' | 
sed 's/.*:\([1-9][0-9]*\)->.*/\1/' 

자세한 내용은 the fine documentation을 참조하십시오. --format 옵션을 올바르게 이해하려면 Go template 설명서도 필요합니다. 나는 그것이 남은 sed 스 니펫을 제거하는 것을 사용하는 것이 가능해야한다고 상상하지만, 나는 충분히 배울 자세가 아니다. 실제로 지금 당장 그것을해라. 나는 당신의 명령을 변경하는 것이 좋습니다 것입니다 귀하의 요구에 대한

Template parsing error: template: :1:37: executing "" at <.NetworkSettings.Por...>: map has no entry for key "NetworkSettings" 
+0

http://stackoverflow.com/questions/23466497/how-to-truncate-a -string-in-a-golang-template은 유망하지만 위협적입니다. – tripleee

0

: 나는 다음과 같은 오류 메시지가, 그러나

docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 

:


Docker cheat sheet 다음 공식을 가지고 :

port=$(docker-compose port database-docker 3306 | sed 's/.*://') 

docker port 및 관련 docker-compose port 명령은 선택한 컨테이너/서비스 및 내부 포트 번호에 대해 요청 된 게시 된 포트를 반환하는 데 사용됩니다.

관련 문제