เรียกใช้สคริปต์ใน 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"

และ bu เรียกใช้คอนเทนเนอร์ที่กำลังทำงานของฉัน:

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

ดูเหมือนจะไม่มีอะไรทำงาน

คุณรู้วิธีการทำหรือไม่?


ไม่bootstarp.shมีชุดปฏิบัติการบิต?
jwodder

ชอบ 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
เอิ่มมาห์เกอร์ด bootstarp!
Bruno Bronosky

คำตอบ:


130

RUNและENTRYPOINTเป็นสองวิธีที่แตกต่างกันในการรันสคริปต์

RUNหมายความว่าสร้างคอนเทนเนอร์กลางรันสคริปต์และหยุดสถานะใหม่ของคอนเทนเนอร์นั้นในอิมเมจกลางใหม่ สคริปต์จะไม่ทำงานหลังจากนั้น: ภาพสุดท้ายของคุณควรจะสะท้อนถึงผลลัพธ์ของสคริปต์นั้น

ENTRYPOINT หมายความว่าอิมเมจของคุณ (ซึ่งยังไม่ได้เรียกใช้สคริปต์) จะสร้างคอนเทนเนอร์และเรียกใช้สคริปต์นั้น

ในทั้งสองกรณีจำเป็นต้องเพิ่มสคริปต์และRUN chmod +x /bootstrap.shเป็นความคิดที่ดี

ควรเริ่มต้นด้วยShebang (เช่น#!/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

นอกเหนือจากคำตอบด้านบน:

ถ้าคุณสร้าง / แก้ไขไฟล์สคริปต์ของคุณ .sh ใน Windows ให้แน่ใจว่ามันถูกบันทึกไว้กับสายสิ้นสุดในรูปแบบยูนิกซ์ โดยค่าเริ่มต้นตัวแก้ไขจำนวนมากใน Windows จะแปลงส่วนท้ายบรรทัด Unix เป็นรูปแบบ Windows และ Linux จะไม่รู้จัก shebang (#! / bin / sh) ที่จุดเริ่มต้นของไฟล์ ดังนั้น Linux จะสร้างข้อความแสดงข้อผิดพลาดเช่นถ้าไม่มี shebang

เคล็ดลับ:

  • หากคุณใช้ Notepad ++ คุณต้องคลิก "แก้ไข / EOL Conversion / 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 ใน windows โครงสร้างนักเทียบท่าล้มเหลวเนื่องจากอักขระสุ่มบางตัว ฉันเปลี่ยนการตั้งค่าใน VS Code และมันก็เริ่มทำงานทันที ขอบคุณ! ฉันโหวตแล้ว
Adithya Upadhya

24

พยายามสร้างสคริปต์ด้วยADDคำสั่งและข้อกำหนดของไดเร็กทอรีการทำงานเช่นนี้ ("สคริปต์" คือชื่อของสคริปต์และ/root/script.shเป็นที่ที่คุณต้องการในคอนเทนเนอร์ซึ่งอาจเป็นเส้นทางอื่น:

ADD script.sh /root/script.sh

ในกรณีADDนี้ต้องมาก่อนCMDหากคุณมี BTW หนึ่งรายการเป็นวิธีที่ยอดเยี่ยมในการนำเข้าสคริปต์ไปยังตำแหน่งใด ๆ ในคอนเทนเนอร์จากเครื่องโฮสต์

ในCMDสถานที่[./script]

ควรเรียกใช้สคริปต์ของคุณโดยอัตโนมัติ

คุณยังสามารถระบุWORKDIRเป็น/rootจากนั้นคุณจะถูกวางไว้ในรูทโดยอัตโนมัติเมื่อเริ่มต้นคอนเทนเนอร์


นักเทียบท่าระบุตำแหน่งที่ script.sh อยู่ในตอนแรกอย่างไร ฉันหมายถึงพารามิเตอร์แรกscript.sh
พระอาทิตย์ตก

เนื่องจากคุณกำลังสร้างคอนเทนเนอร์คุณยังรับผิดชอบในการวางเส้นทางด้วย
Michael

เส้นทางและชื่อของพารามิเตอร์ตัวแรกscript.shสัมพันธ์กับDockerfile
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.