2015-12-31 42 views
26

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

tôi đã cố gắng như vậy:

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 thi chứa chạy của tôi:

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

Không có gì có vẻ làm việc.

Bạn có biết cách thực hiện không?

+0

là tên tập tin có đúng không? –

+0

có tên tệp là chính xác – Kevin

+0

Có 'bootstarp.sh' có tập bit thực thi không? – jwodder

Trả lời

34

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

RUN có nghĩa là nó tạo vùng chứa trung gian, chạy tập lệnh và đóng trạng thái mới của vùng chứa đó thành hình ảnh trung gian mới. Kịch bản sẽ không được chạy sau đó: hình ảnh cuối cùng của bạn được cho là 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 vùng chứa và chạy tập lệnh đó.

Trong cả hai trường hợp, tập lệnh cần phải được thêm và RUN chmod +x /bootstarp.sh là một ý tưởng hay.

Nó cũng nên bắt đầu với một shebang (như #!/bin/sh)

Xét kịch bản của bạn (KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh: một vài git config --global lệnh), nó sẽ là tốt nhất để chạy kịch bản mà một lần trong Dockerfile của bạn, nhưng đảm bảo sử dụng người sử dụng phải (file git config toàn cầu là% HOME%/gitconfig, mà theo mặc định là một/root.)

Thêm vào your Dockerfile:

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.

+3

Ngoài ra, bạn có thể có nghĩa là 'bootstrap.sh' thay vì' bootstarp.sh': xem http://stackoverflow.com/a/1254561/6309 – VonC

+0

Cool! Hoạt động rất tốt với RUN /bootstrap.sh – Kevin

+0

Con quái vật trên dòng đầu tiên đã làm điều đó cho tôi, cảm ơn! :) – GDICommander

14

Cố gắng tạo ra kịch bản với ADD lệnh và đặc điểm kỹ thuật của thư mục làm việc Như thế này ("kịch bản" là tên của kịch bản và /root/script.sh là nơi bạn muốn nó trong container, nó có thể là con đường khác nhau:

ADD script.sh /root/script.sh 

trong trường hợp này ADD có đến trước CMD, nếu bạn có một BTW đó là cách tuyệt vời để nhập khẩu các kịch bản cho bất kỳ vị trí trong container từ máy chủ

trong CMD nơi [./script]

Nó sẽ tự động thực thi kịch bản của bạn

Bạn cũng có thể chỉ định WORKDIR như /root, sau đó you'l được tự động đặt trong thư mục gốc, khi bắt đầu một container

Các vấn đề liên quan