Chạy một tập lệnh trong Dockerfile


93

Tôi đang cố chạy một tập lệnh trong quá trình xây dựng trong Dockerfile của mình. Nhưng nó dường như không hoạt động.

Tôi đã thử theo cách đó:

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

Cũng theo cách này:

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

Và cũng bu thực hiện vùng chứa đang chạy của tôi:

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

Dường như không có gì hoạt động.

Bạn có biết làm thế nào để làm điều đó?


bootstarp.shbit thực thi được đặt không?
jwodder

Giống như RUN chmod + x /bootstarp.sh?
Kevin,

2
Với "không hoạt động", chính xác thì điều gì đang xảy ra? Nó có hiển thị lỗi không? Tệp có bên trong hình ảnh không? Nếu bạn docker exec -it symfony bashở trong vùng chứa, bạn có thể chạy tập lệnh theo cách thủ công và kiểm tra nội dung của nó không? ( cat bootstarp.sh)?
thaJeztah

hãy thử điều này: docker exec symfony /bin/bash /bootstarp.shvà cho tôi biết kết quả đầu ra.
Boynux

12
Ermahgerd bootstarp!
Bruno Bronosky, 13:17

Câu trả lời:


128

RUNENTRYPOINTlà hai cách khác nhau để thực thi một tập lệnh.

RUNcó nghĩa là nó tạo một vùng chứa trung gian, chạy tập lệnh và đóng băng trạng thái mới của vùng chứa đó trong một hình ảnh trung gian mới. Tập lệnh sẽ không được chạy sau đó: hình ảnh cuối cùng của bạn phải phản ánh kết quả của tập lệnh đó.

ENTRYPOINT có nghĩa là hình ảnh của bạn (chưa thực thi tập lệnh) sẽ tạo một vùng chứa và chạy tập lệnh đó.

Trong cả hai trường hợp, script cần phải được thêm vào và a RUN chmod +x /bootstrap.shlà một ý tưởng hay.

Nó cũng nên bắt đầu bằng shebang (như #!/bin/sh)

Xem xét tập lệnh của bạn ( bootstarp.sh: một vài git config --globallệnh), tốt nhất RUNlà tập lệnh đó một lần trong tập lệnh của bạn Dockerfile, nhưng hãy đảm bảo sử dụng đúng người dùng ( git configtệp chung %HOME%/.gitconfig, theo mặc định là tệp /root)

Thêm vào Dockerfile của bạn:

RUN /bootstart.sh

Sau đó, khi chạy một vùng chứa, hãy kiểm tra nội dung của /root/.gitconfigđể xác nhận tập lệnh đã được chạy.


5
Ngoài ra, bạn có thể có ý bootstrap.shthay vì bootstarp.sh: xem stackoverflow.com/a/1254561/6309
VonC

Mát mẻ! Hoạt động rất tốt với RUN /bootstrap.sh
Kevin

1
Shebang ở dòng đầu tiên đã làm điều đó cho tôi, cảm ơn! :)
GDICommander

33

Ngoài các câu trả lời trên:

Nếu bạn đã tạo / chỉnh sửa tệp tập lệnh .sh của mình trong Windows, hãy đảm bảo tệp được lưu với dòng kết thúc ở định dạng Unix . Theo mặc định, nhiều trình soạn thảo trong Windows sẽ chuyển đổi phần cuối dòng Unix sang định dạng Windows và Linux sẽ không nhận dạng shebang (#! / Bin / sh) ở đầu tệp. Vì vậy, Linux sẽ tạo ra thông báo lỗi giống như nếu không có shebang.

Lời khuyên:

  • Nếu bạn sử dụng Notepad ++, bạn cần nhấp vào "Chỉnh sửa / Chuyển đổi EOL / UNIX (LF)"
  • Nếu bạn sử dụng Visual Studio, tôi khuyên bạn nên cài đặt plugin " End Of Line ". Sau đó, bạn có thể hiển thị phần cuối của dòng bằng cách nhấn Ctrl-R, Ctrl-W. Và để đặt kết thúc kiểu Linux, bạn có thể nhấn Ctrl-R, Ctrl-L. Đối với kiểu Windows, nhấn Ctrl-R, Ctrl-C.

4
Wow, bạn đã cứu một ngày của tôi. Cảm ơn vì điều này.
mw

2
Xuất sắc! đây là vấn đề CHÍNH XÁC của tôi!
Kevinsyel

1
VSCode của tôi đã tự động đặt phần cuối xếp hàng của tập lệnh shell thành CRLF trong cửa sổ. Quá trình xây dựng docker không thành công do một số ký tự ngẫu nhiên. Tôi đã thay đổi cài đặt trong VS Code và nó ngay lập tức bắt đầu hoạt động. Cảm ơn! Tôi đã ủng hộ.
Adithya Upadhya

24

Cố gắng tạo script bằng ADDlệnh và đặc tả của thư mục làm việc Như thế này ("script" là tên của script và /root/script.shlà nơi bạn muốn nó trong vùng chứa, nó có thể là đường dẫn khác:

ADD script.sh /root/script.sh

Trong trường hợp ADDnày phải đến trước CMD, nếu bạn có một BTW, cách tuyệt vời để nhập tập lệnh vào bất kỳ vị trí nào trong vùng chứa từ máy chủ

Tại CMDchỗ[./script]

Nó sẽ tự động thực thi tập lệnh của bạn

Bạn cũng có thể chỉ định WORKDIR/root, sau đó bạn sẽ tự động được đặt trong thư mục gốc, khi bắt đầu một vùng chứa


Làm cách nào để docker xác định vị trí của script.sh lúc đầu? Ý tôi là, tham số đầu tiên,script.sh
hoàng hôn

vì bạn đang xây dựng thùng chứa, bạn cũng phụ trách việc đặt đường dẫn
Michael

đường dẫn và tên của tham số đầu tiên script.shcó liên quan đếnDockerfile
eja

4

Cách tốt nhất là sử dụng COPYthay vì ADDkhi bạn sao chép từ hệ thống tệp cục bộ sang hình ảnh. Ngoài ra, tôi khuyên bạn nên tạo một thư mục con để đặt nội dung của bạn vào. Nếu không có gì khác, nó giữ mọi thứ ngăn nắp. Đảm bảo rằng bạn đánh dấu tập lệnh là có thể thực thi bằng cách sử dụng chmod.

Ở đây, tôi đang tạo một scriptsthư mục con để đặt tập lệnh của mình vào và chạy nó từ:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.