Docker: thêm một tập tin từ thư mục cha


186

Trong tôi Dockerfileđã có:

ADD ../../myapp.war /opt/tomcat7/webapps/

Tệp đó tồn tại dưới dạng ls ../../myapp.wartrả về cho tôi tệp chính xác nhưng khi tôi thực thi sudo docker build -t myapp .tôi đã nhận được:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

Có ai biết tại sao và làm thế nào để làm điều đó một cách chính xác?


Câu trả lời:


225

Bạn có thể xây dựng Dockerfile từ thư mục mẹ:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
Cảm ơn bạn! Điều này hoạt động tốt trên một hộp cục bộ, nhưng Docker Hub không thể xây dựng hình ảnh vì nó cố gắng thực hiện nó từ cùng thư mục của nó (tbh, đúng như những gì người ta thường mong đợi). Có cách nào để thực hiện thủ thuật tương tự trong Docker Hub không?
Marcel Hernandez

Không phải là tôi biết. Bạn có thể đẩy hình ảnh vào sổ đăng ký thay vì sử dụng xây dựng tự động.
Boedy

2
@ eduncan911 Tôi không nghĩ rằng điều này không được chấp nhận tại thời điểm tôi viết bình luận của mình. Họ có thể đã thay đổi tâm trí của họ kể từ đó? Nếu tôi sai, bạn có thể liên kết đến tài liệu mà nó nói rằng nó không được chấp nhận. Cảm ơn!
omninonsense

6
-f dường như không được phản đối theo các tài liệu -> Chỉ định Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/ Lỗi
Ray

6
@ eduncan911 bạn có thể xóa bình luận của mình vì nó dường như không được phản đối? Tôi đã bỏ qua câu trả lời này ban đầu vì nhận xét của bạn.
Chris Anderson

103

Thật không may, (vì lý do thực tế và bảo mật tôi đoán), nếu bạn muốn thêm / sao chép nội dung cục bộ, nó phải nằm dưới cùng một đường dẫn gốc hơn Dockerfile.

Từ tài liệu :

Đường dẫn <src> phải nằm trong ngữ cảnh của bản dựng; bạn không thể THÊM ../s Something / Something , vì bước đầu tiên của quá trình xây dựng docker là gửi thư mục bối cảnh (và thư mục con) đến daemon docker.

EDIT: Hiện tại có một tùy chọn ( -f) để đặt đường dẫn cho Dockerfile của bạn; nó có thể được sử dụng để đạt được những gì bạn muốn, xem phần trả lời của @Boedy.


22
Có một cách giải quyết "sạch" cho việc này không? Tôi không muốn cơ cấu lại toàn bộ thư mục dự án của tôi chỉ để phù hợp với điều này.
ben_frankly

Như đã nói bởi @ Günter, có một cách giải quyết ở đây superuser.com/a/842690/136024 ... nó có thực sự "sạch" không? Ít nhất đó là một "cách giải quyết" :)
Anthony O.

2
Xem câu trả lời tốt hơn từ @Boedy stackoverflow.com/a
432300129/2950621

103

Với docker-compose, bạn có thể đặt thư mục ngữ cảnh:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

9

Thêm một số đoạn mã để hỗ trợ câu trả lời được chấp nhận.

Cấu trúc thư mục :

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Mục nhập tệp Docker:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Lệnh được sử dụng để xây dựng hình ảnh docker

docker build -t test:latest -f setup/docker/Dockerfile .

cách tiếp cận tuyệt vời. Có thể chia sẻ mã install_x.shlà tốt?
Ariful Haque

4

Giải pháp cho những người sử dụng trình soạn thảo là sử dụng âm lượng trỏ đến thư mục mẹ:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

Nhưng tôi khá chắc chắn rằng có thể được thực hiện chơi với âm lượng trong Dockerfile .


3
Nó không thể. Lưu ý: Thư mục máy chủ, về bản chất, phụ thuộc vào máy chủ. Vì lý do này, bạn không thể gắn thư mục máy chủ từ Dockerfile vì hình ảnh được xây dựng phải có thể mang theo được. Một thư mục máy chủ sẽ không có sẵn trên tất cả các máy chủ tiềm năng. docs.docker.com/engine/tutorials/dockervolume/ từ
Peeter Kokk

4

Kể từ khi -fgây ra một vấn đề khác, tôi đã phát triển một giải pháp khác.

  • Tạo một hình ảnh cơ sở trong thư mục cha
  • Đã thêm các tập tin cần thiết.
  • Đã sử dụng hình ảnh này làm hình ảnh cơ sở cho dự án trong thư mục con cháu.

Các -fcờ không giải quyết vấn đề của tôi bởi vì tôi onbuildnhìn hình ảnh cho một tập tin trong một thư mục và đã phải gọi như thế này:

-f foo/bar/Dockerfile foo/bar

thay vì

-f foo/bar/Dockerfile .

Cũng lưu ý rằng đây chỉ là giải pháp cho một số trường hợp như -fcờ

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.