2016-07-21 3 views
1

가 나는 Dockerfile 등을 찾을 수 없음 :도커 이미지 엔트리 포인트 스크립트

FROM frolvlad/alpine-oraclejdk8:slim 
ADD build/libs/zuul*.jar /app.jar 
ADD src/main/script/startup.sh /startup.sh 
EXPOSE 8080 8999 
ENTRYPOINT ["/startup.sh"] 

startup.sh은 다음과 같습니다

#!/bin/sh 
set -e 

if [ $# -eq 0 ] 
then 
    echo "Environment value required" 
    exit 1 
fi 

java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml -Djava.security.egd=file:/dev/./urandom -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=8999 app.jar 

하지만 docker run 그것을 실행할 때, 나는 docker: Error response from daemon: Container command '/startup.sh' not found or does not exist..을 얻었다. 쉘 스크립트에 실행 권한이 있습니다.

다른 앱을 실행하는 데 동일한 방법을 사용했는데 모두 정상적으로 작동합니다. Mac에서 파일을 작성하고 Linux 컴퓨터에서 컨테이너를 실행하려고했습니다.

답변

2

그것은 문제의 원인이 ^M DOS 스타일의 라인 끝 문자로 밝혀 있는지 확인합니다. 하지만 Mac에서 편집 중이므로 vim으로 여러 번 검사 했으므로 로컬 컴퓨터의 시작 스크립트에 해당 문자가 없음을 확신합니다. 그러나 컨테이너 내부의 정력으로 열면 어디서나 ^M을 볼 수 있습니다. 이렇게 여하튼 그 char는 이미지에 복사 될 때 startup.sh에 추가됩니다. 그것은 이상합니다. 그러면 스크립트가 호출되지 않습니다.

해결책은 Dockerfile의 ENTRYPOINT 앞에 dos2unix filename을 추가하는 것입니다. 그러나 기본 이미지에 해당 유틸리티가 있는지 확인하십시오.

+1

안녕하세요. 조사 결과에 대해 커뮤니티에 알려 주셔서 감사합니다. 이 별난에 대해 여기서 주목할만한 가치가 있습니다. 어쨌든. 문제가 해결되었음을 알려드립니다. + 1 –

0

여기서 문제는 /app.jar과 같은 경로를 지정하면 실제로 current working directory이 어디에 있는지 파악하기가 어렵다는 것입니다.

Docker가 우연히 start.sh을 그 곳의 어떤 장소 에라도 복사해야하는 것으로 의심되는 곳이면 어디든 될 수 있습니다. ./입니다.

컨테이너에 들어가서 find을 검색하여 startup.sh이 어디에 있는지 볼 수 있습니다.

  1. docker ps -a - 파일을 찾을 - SSH
  2. find . -name "startup.sh" 내부 - 고정 표시기 컨테이너 ID
  3. docker -i -t [CONTAINER_ID] /bin/bash를 찾을 수 있습니다.

당신이 ./ (현재 작업 디렉토리)를 사용하여를 통해 파일을 복사하려는 경우, 나는 current가 위치를 지정하는 것이 더있을 거라고 생각. 그리고 WORKDIR 키워드를 사용하여이 작업을 수행 할 수 있습니다.

예 : WORKDIR /path/to/workdir

명령 COPY이 그것을 따라 ADD 명령어의 CMD, 엔트리 포인트, 어떤 RUN에 대한 작업 디렉토리를 설정하는 WORKDIR Dockerfile. WORKDIR이 없으면 후속 Dockerfile 명령어에서 이 사용되지 않아도 생성됩니다.

그런 방식으로 도커가 혼동하지 않을 것입니다.

은 참조 : https://docs.docker.com/engine/reference/builder/#/workdir

+0

내가 멈춘 컨테이너에 ssh 할 수없는 것 같습니다. 'startup.sh' 파일을 찾을 수 없으므로 컨테이너를 시작할 수 없습니다. –

+0

WORKDIR을 설정하면'startup.sh' 파일을 찾을 수 있습니까? @VonC의 솔루션도 시도해 볼 가치가있다. –

+0

둘 다 시도했다. 나는 처음에'WORKDIR /'를 설정했지만 여전히 작동하지 않습니다. –

1

쉘 스크립트가 실행 권한을 가지고있다.

그래도 괜찮습니까?

EXPOSE 8080 8999 
COPY src/main/script/startup.sh /startup.sh 
RUN chmod 755 /startup.sh 
WORKDIR/
ENTRYPOINT ["/startup.sh"] 
+1

'/ bin/sh : CHMOD : not found을 받았습니다. '/ bin/sh -c CHMOD 755/startup.sh'명령은 0이 아닌 코드를 반환했습니다 : 127' –

+0

사실 그것은 소문자'chmod'입니다. 하지만 여전히 같은 오류가 발생합니다. –

1

컨테이너 종료 할 때 주요 프로세스가 종료 :
가 나는 Dockerfile을 사용, 확실히 (I 컨테이너 내 을 의미 추가 onced). 따라서 /startup.sh이 끝나지 않았는지 확인하십시오.

는 특히이 자바가

java -jar -Xms400m -Xmx400m -Dlog4j.configurationFile=log4j2-qa2.xml \ 
    -Djava.security.egd=file:/dev/./urandom \ 
    -Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=8999 \ 
    -Dcom.sun.management.jmxremote.local.only=false \ 
    -Dcom.sun.management.jmxremote.rmi.port=8999 \ 
    app.jar 
+0

무엇을 의미합니까? '/ startup.sh'가 올바르게 쓰여지지 않았다는 것을 의미합니까? –

+0

줄 끝 문제 인 것 같습니다. 나는 컨테이너 안에있을 때 각 라인의 끝에서'^ M '을 본다. 나는 컨테이너 안에서'vim '으로 열었다. 내가 그 문자를 삭제하고 실행할 수 있습니다. 그러나 용기 밖에서 나는 그 문자들을'vim '으로 볼 수 없습니다. 나는 맥에서 편집과 모든 작업을하고 있었고, 나는 그 문자들을 얻지 않아야했다. 어떤 생각? –

+0

http://vim.wikia.com/wiki/File_format –

관련 문제