2016-10-04 2 views
3

다른 app을 시작하기 전에 데이터베이스가 준비되어 있는지 확인하기 위해 wait-for-it 스크립트를 사용하고 있습니다.succesfull wait-for-it 스크립트 후 도커 컨테이너를 시작하는 방법

#!/bin/bash 

set -e 

host="$1" 
shift 
cmd="[email protected]" 

until psql -h "$host" -U "postgres" -c '\l'; do 
    >&2 echo "Postgres is unavailable - sleeping" 
    sleep 1 
done 

>&2 echo "Postgres is up - executing command" 
exec $cmd 

이 스크립트는 here입니다. 이제 내 앱 컨테이너가 MySQL is up - executing command과 함께 실행되지 않습니다. 그렇다면 스크립트가 성공적으로 실행되었지만 (db가 실행 중임) 내 앱의 dockerfile에있는 실제 CMD (스크립트 이후)를 실행하는 방법이 명확하지 않습니다. 첫 번째 것들 중

COPY docker-entrypoint.sh /entrypoint.sh 
COPY ./wait-for-it.sh wait-for-it.sh 
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 2368 
CMD ["npm", "start"] 
+0

'ENTRYPOINT'을 제거하고 둘 다'CMD'에 넣을 수 있습니다 :'CMD /entrypoint.sh && npm start'. –

+0

안녕하세요, 당신이 말한대로했는데 성공한 psql 검사 후 CMD에서 명령을 실행할 수없는 것 같습니다. 따라서 이미지가 빌드되고, 도커 작성은 wait-for-it 스크립트를 실행합니다. 따라서 컨테이너가 시작될 수는 있지만 성공하지 못합니다. 아무 일도 일어나지 않습니다. – DenCowboy

+0

wait-for-it 스크립트에 인수가 필요하다고 생각합니다. '/entrypoint.sh localhost npm start'을 시도하십시오. 미안 리눅스 박스가 없으므로 지금 테스트 할 수 없습니다. 회신에 감사드립니다. –

답변

2

하자 명확 최대 몇 :

내 dockerfile의 끝입니다. Dockerfile에서 ENTRYPOINTCMD을 모두 사용하면 CMD 값이 ENTRYPOINT에 매개 변수로 전달됩니다. 따라서 현재 파일에있는 내용은

/entrypoint.sh npm start 

으로 변환됩니다. 컨테이너를 시작할 때 실행됩니다. entrypoint.sh에서 무슨 일이 일어나고 있는지 알지 못하면 어떤 영향을 미치는지 알기가 어렵습니다.

  • Dockerfile에서 ENTRYPOINT을 제거 도커는

    다음과 같은 변화를 만들 수

    이 시도해주십시오. 다음

  • 변경 CMD :

    CMD /wait-for-it.sh localhost && /entrypoint.sh npm start 
    

그 일을 다음과 같이 조정하십시오 :

  • wait-for-it.sh의 경로 - 스크립트를 복사하는 곳으로 조정하십시오 Dockerfile에있는 파일. entrypoint.sh과 같은 폴더에 복사하는 것이 좋습니다.
  • wait-for-it.sh 스크립트 파일의 localhost 인수는 데이터베이스 호스트로 바꾸십시오. 위가하는 일

wait-for-it.sh 스크립트를 실행하고 데이터베이스가되면 다음, 당신이 ENTRYPOINTCMD에 있던 이전의 명령이 실행됩니다. 현재 보유하고있는 것과 비교할 수 있어야합니다.

entrypoint.sh 스크립트에서 wait-for-it.sh 스크립트를 호출하고 대기 스크립트가 완료되면 추가 단계 (npm start) 만 실행할 수도 있습니다. ...

도커-작성하면 최대

당신이 당신의 용기를 시작하기위한 도커-작성을 사용하는 경우 컨테이너가 귀하의 docker-compose.yaml 파일에 command 속성을 사용하여 시작할 때 실행되는 명령을 덮어 쓸 수 있습니다 , 예.

command: > 
    bash -c " 

    /wait-for-it.sh localhost 
    && /entrypoint.sh npm start 
    " 

하는 여러 (이 경우 배쉬) 당신의 선택의 쉘을 사용하여 명령
  • 따옴표를 시작

    • bash -c의 사용을 유의하시기 바랍니다, 당신은 여러 라인을 가지고 그들을 필요합니다.

    기본적으로이 명령을 사용하면 && 연산자를 사용하여 여러 명령을 연결하고 서로 연결할 수 있습니다.

    대기 위해-이

    스크립트

    BTW : 나는 상기와 동일한 방법으로 좋은 결과와 유사한 목적이 wait-for-it script를 사용합니다. 그것은 대기 스크립트의 버전보다 약간 더 강하며 모든 호스트/포트 조합을 거의 지원합니다. MySQL을 기다리는 데 사용합니다. MySQL 또는 PostgreSQL에 대한 질문인지 확실하지 않습니다.

  • +0

    나는 mysql을 사용하고 있지만 스크립트는 도커 설명서에서 복사되었지만 mysql에 적합하고 잘 작동한다. 나 또한 도커 작성으로 시작하려고하는데 도커 파일을 편집해야합니까? – DenCowboy

    +0

    Docker-Compose에 대한 섹션으로 답변을 업데이트했습니다. – nwinkler

    관련 문제