Dockerfile에서 스크립트 실행


93

Dockerfile에서 빌드 프로세스 중에 스크립트를 실행하려고합니다. 그러나 작동하지 않는 것 같습니다.

나는 그렇게 시도했다.

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

또한이 방법 :

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

또한 실행중인 컨테이너를 실행합니다.

docker exec symfony /bin/bash -c "/bootstrap.sh"

아무것도 작동하지 않는 것 같습니다.

어떻게하는지 알아?


않습니다 bootstarp.sh실행 비트 세트가?
jwodder dec

그런 RUN chmod + x /bootstarp.sh?
Kevin

2
"작동하지 않음"으로 정확히 어떤 일이 발생합니까? 오류가 표시됩니까? 이미지 안에 파일이 있습니까? docker exec -it symfony bash컨테이너 내부에 있다면 스크립트를 수동으로 실행하고 내용을 확인할 수 있습니까? ( cat bootstarp.sh)?
thaJeztah

이것을 시도 docker exec symfony /bin/bash /bootstarp.sh하고 출력을 알려주십시오.
Boynux

12
Ermahgerd bootstarp!
Bruno Bronosky

답변:


128

RUNENTRYPOINT스크립트를 실행하는 두 가지 방법입니다.

RUN즉, 중간 컨테이너를 만들고 스크립트를 실행하며 새 중간 이미지에서 해당 컨테이너의 새 상태를 고정합니다. 그 후에는 스크립트가 실행되지 않습니다. 최종 이미지는 해당 스크립트의 결과를 반영해야합니다.

ENTRYPOINT 이미지 (아직 스크립트를 실행하지 않은)가 컨테이너를 만들고 해당 스크립트를 실행 함을 의미합니다.

두 경우 모두 스크립트를 추가해야하며 a RUN chmod +x /bootstrap.sh는 좋은 생각입니다.

그것은 또한 시작해야 오두막 (같은 #!/bin/sh)

스크립트 ( bootstarp.sh: 몇 가지 git config --global명령)를 고려 하면 RUN해당 스크립트에에서 한 번만 사용하는 것이 가장 Dockerfile좋지만 올바른 사용자를 사용해야합니다 (전역 git config파일은 %HOME%/.gitconfig기본적으로 /root).

Dockerfile에 추가하십시오.

RUN /bootstart.sh

그런 다음 컨테이너를 실행할 때의 내용 /root/.gitconfig을 확인하여 스크립트가 실행되었는지 확인합니다.


5
또한, 당신은 의미가 있습니다 bootstrap.sh대신 bootstarp.sh참조 : stackoverflow.com/a/1254561/6309
VonC

멋있는! RUN /bootstrap.sh와 매우 잘 작동
Kevin

1
첫 번째 줄의 shebang이 나를 위해 해주었습니다. 감사합니다! :)
GDICommander

34

위의 답변 외에도 :

Windows에서 .sh 스크립트 파일을 생성 / 편집 한 경우 Unix 형식으로 끝나는 줄로 저장되었는지 확인하십시오 . 기본적으로 Windows의 많은 편집기는 Unix 줄 끝을 Windows 형식으로 변환하고 Linux는 파일 시작 부분에서 shebang (#! / bin / sh)을 인식하지 못합니다. 따라서 Linux는 shebang이없는 경우와 같은 오류 메시지를 생성합니다.

팁 :

  • Notepad ++를 사용하는 경우 "편집 / EOL 변환 / UNIX (LF)"를 클릭해야합니다.
  • Visual Studio를 사용하는 경우 " End Of Line "플러그인을 설치하는 것이 좋습니다 . 그런 다음 Ctrl-R, Ctrl-W를 눌러 줄 끝을 표시 할 수 있습니다. Linux 스타일 엔딩을 설정하려면 Ctrl-R, Ctrl-L을 누릅니다. Windows 스타일의 경우 Ctrl-R, Ctrl-C를 누릅니다.

4
와우, 당신은 내 하루를 구했습니다. 감사합니다.
mw

2
훌륭한! 이것은 내 정확한 문제였습니다!
Kevinsyel

1
내 VSCode는 자동으로 쉘 스크립트의 끝을 CRLF로 설정했습니다. 임의의 문자로 인해 도커 빌드가 실패했습니다. VS Code에서 설정을 변경하고 즉시 작동하기 시작했습니다. 감사! 나는 찬성했습니다.
Adithya Upadhya

24

ADD작업 디렉토리의 명령 및 사양 을 사용하여 스크립트를 작성하십시오. 이와 같이 ( "script"는 스크립트의 이름이며 /root/script.sh컨테이너에서 원하는 위치 이며 다른 경로 일 수 있습니다.

ADD script.sh /root/script.sh

이 경우 ADD이전에 와야합니다. CMDBTW가 하나 있으면 호스트 컴퓨터에서 컨테이너의 모든 위치로 스크립트를 가져 오는 멋진 방법입니다.

에서 CMD장소[./script]

자동으로 스크립트를 실행해야합니다.

당신은 또한 지정할 수 있습니다 WORKDIR/root자동으로 컨테이너를 시작할 때, 루트에 배치 you'l,


docker는 script.sh가 처음에 어디에 있는지 어떻게 식별합니까? 내 말은, 첫 번째 매개 변수는script.sh
sunsets

컨테이너를 만들고 있기 때문에 경로
Michael

첫 번째 매개 변수의 경로와 이름은script.shDockerfile
eja

4

로컬 파일 시스템에서 이미지로 복사 할 때 COPY대신 사용하는 것이 가장 좋습니다 ADD. 또한 콘텐츠를 저장할 하위 폴더를 만드는 것이 좋습니다. 다른 것이 없다면 일을 깔끔하게 유지합니다. 을 사용하여 스크립트를 실행 파일로 표시했는지 확인하십시오 chmod.

여기에서 scripts스크립트를 배치하고 실행할 하위 폴더를 만듭니다 .

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.