Thay đổi lệnh thư mục trong Docker?


214

Trong docker tôi muốn làm điều này:

git clone XYZ
cd XYZ
make XYZ

Tuy nhiên vì không có lệnh cd, tôi phải vượt qua trong đường dẫn đầy đủ mọi lúc (tạo XYZ / fullpath). Bất kỳ giải pháp tốt cho việc này?



6
Lệnh WORKDIR cũng được ghi nhận là một cách giải quyết khả thi
trcarden

1
Không phải là một cách giải quyết, đó là giải pháp được đề xuất docs.docker.com/engine/userguide/eng-image/ mẹo
John John Pichler

Câu trả lời:


151

Bạn có thể chạy tập lệnh hoặc tham số phức tạp hơn với RUN. Dưới đây là một ví dụ từ Dockerfile mà tôi đã tải xuống để xem trước đây:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip

Do sử dụng '&&', nó sẽ chỉ nhận được lệnh 'pip install' cuối cùng nếu tất cả các lệnh trước đó đã thành công.

Trên thực tế, vì mỗi RUN tạo ra một cam kết mới & (hiện tại) một lớp AUFS, nếu bạn có quá nhiều lệnh trong Dockerfile, bạn sẽ sử dụng hết các giới hạn, do đó, việc hợp nhất các RUN (khi tệp ổn định) có thể rất điều hữu ích để làm.


98
Trong trường hợp bạn đang tự hỏi, hiệu ứng của cdchỉ duy nhất kéo dài cho RUNlệnh hiện tại . Việc tiếp theo RUNsẽ bắt đầu từ hiện tại WORKDIR.
Ritchie

530

Để thay đổi vào thư mục khác, sử dụng WORKDIR . Tất cả các lệnh RUN, CMD và ENTRYPOINT sau WORKDIR sẽ được thực thi từ thư mục đó.

RUN git clone XYZ 
WORKDIR "/XYZ"
RUN make

40
Sử dụng WORKDIR cũng được trích dẫn là cách thực hành tốt nhất của dockerfile
Martin Woolstenhulme

14
Tôi tin rằng đây là một câu trả lời thích hợp hơn cho câu hỏi
Juan Leni

1
Lưu ý rằng điều này tạo ra nhiều lớp (tôi nghĩ vậy?)
Sebi

Đây phải là câu trả lời được chấp nhận. Đã thử nghiệm và có thể xác nhận nó hoạt động
user1258361

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.