Heroku에서 Apache HTTP Server 컨테이너를 그대로 움직이려고하면 crash를 해결하는 메모

결론부터 말하면


  • Heroku는 컨테이너에 외부 액세스를 허용하는 포트를 동적으로 할당합니다.
  • 따라서 httpd.conf에 Listen 할 포트 번호를 고정으로 작성하면 통신 할 수 없습니다.
  • Heroku가 동적으로 할당하는 포트 번호는 환경 변수 $ PORT로 얻을 수 있습니다.
  • Dockerfile에서 ENTRYPOINT를 실행할 때 Listen 지시문을 $ PORT의 값으로 편집하는 명령을 실행하면 어떻게됩니다


  • 컨테이너를 푸시하면 오류가 발생합니다.



    예를 들면 Dockerfile는 이런 느낌.
    FROM httpd:alpine
    MAINTAINER xsgk
    
    ADD ./index.html /usr/local/apache2/htdocs
    

    이것을 배포하면,

    State changed from starting to crashed

    토카

    (13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
    (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
    no listening sockets available, shutting down

    라든지, 이미 에러의 대합창. bind가 할 수 없다는 것은 무엇인가 처음에 접속할 수 없어, 라고 생각하고 있으면 이런 것을 stackoverflow 로 발견했다. 마찬가지로 Apache의 httpd를 사용하여 연결할 수 없다는 상황을 다음과 같이 해결했다.

    Deploy a Dockerized Laravel app using Apache on Heroku

    I discovered I could insert a CMD statement at the end of my Dockerfile to sed replace the ports in my apache config files to the magical $PORT environment variable at run time.

    (의역)

    Dockerfile 끝에 CMD 문을 삽입하는 방식으로 sed 명령을 사용하여 Apache 구성 파일의 포트 스펙을 런타임의 $PORT 환경 변수 값으로 바꿀 수 있음을 발견했습니다.

    과연, 해보자.

    $PORT 값으로 다시 쓰는 프로세스를 Dockerfile에 추가했습니다.



    이번 Dockerfile 은 이런 식으로, ENTRYPOINT 가 실행되는 타이밍에 http.conf 중의 Listen 지시어를 치환( sed ) 한 뒤, 본래의 컨테이너 기동시의 커멘드( httpd-foreground )를 실행하도록 기술.
    FROM httpd:alpine
    MAINTAINER xsgk
    
    ADD ./index.html /usr/local/apache2/htdocs
    
    ENTRYPOINT []
    CMD sed -i -e "s/Listen 80/Listen $PORT/g" /usr/local/apache2/conf/httpd.conf && httpd-foreground
    

    이것을 배포하면

    나왔다. 이상.

    참고



    Deploy a Dockerized Laravel app using Apache on Heroku

    좋은 웹페이지 즐겨찾기