Docker COPY vấn đề - Không có tập tin hoặc thư mục như vậy


38

Trong Dockerfile của tôi, tôi có câu lệnh 'COPY "sau đây:

# Copy app code
COPY /srv/visitor /srv/visitor

Không nên nói rằng trong hệ thống máy chủ của tôi, trong thư mục "/ srv / visitor", thực sự có mã nguồn của tôi:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

Bây giờ, khi tôi cố gắng xây dựng một hình ảnh bằng cách sử dụng Dockerfile này, nó sẽ bị treo ở bước khi "SAO CHÉP" xảy ra:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

Nó nói rằng không có thư mục như vậy, nhưng rõ ràng là có.

Có ý kiến ​​gì không?

CẬP NHẬT 1:

Nó đã được chỉ ra cho tôi rằng tôi đã nhầm, theo cách tôi hiểu xây dựng bối cảnh. Gợi ý đã thay đổi câu lệnh "COPY" thành điều này:

COPY . /srv/visitor

Vấn đề là tôi đã có nó theo cách này và quá trình xây dựng đã dừng lại ở bước tiếp theo:

RUN npm install

Nó nói điều gì đó dọc theo dòng "không tìm thấy tệp pack.json", khi rõ ràng có một.

CẬP NHẬT 2:

Tôi đã thử chạy nó với thay đổi này trong Dockerfile:

COPY source /srv/visitor/

Nó dừng lại khi cố chạy npm:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Vì vậy, bản sao đã được thực hiện? Nếu có, tại sao npm không thể tìm thấy gói.json?


Đối với những người tìm kiếm một vấn đề trong năm 2017 - đây có thể là vấn đề của bạn github.com/docker/for-mac/issues/1922 . nó khuyên bạn nên xóa tập tin .dockerignore của bạn và kiểm tra lại. Nếu điều đó hoạt động, bạn có thể sử dụng các thiết lập của mình trong .dockerignore để giải quyết vấn đề.
Không xác định

Câu trả lời:


36

Từ tài liệu:

Đường <src>dẫn phải nằm trong bối cảnh của bản dựng ; bạn không thể SAO CHÉP ../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.

Khi bạn sử dụng, /srv/visitorbạn đang sử dụng một đường dẫn tuyệt đối bên ngoài bối cảnh xây dựng ngay cả khi đó thực sự là thư mục hiện tại.

Bạn tốt hơn nên tổ chức bối cảnh xây dựng của bạn như thế này:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

Và sử dụng :

COPY resources /srv/visitor/

Chú thích:

docker build - < Dockerfile không có bất kỳ bối cảnh.

Do đó sử dụng,

docker build .


Tôi đã ở trong thư mục "/ srv / visitor" của hệ thống máy chủ của tôi và tất cả mã nguồn của tôi, cộng với Dockerfile, đều ở đây. Tôi nên viết câu lệnh "SAO CHÉP" như thế nào để tất cả nguồn này được sao chép trong thư mục "/ srv / visitor" của người chứa?
dsljanus

1
@dsljanus Thư mục nguồn hoặc tệp phải liên quan đến thư mục xây dựng tức là /srv/visitor.
Xavier Lucas

Vậy, nó có nên là "."? Bởi vì tôi đã có nó theo cách đó và quá trình xây dựng tạm dừng ở bước tiếp theo, "RUN npm install". Nó nói điều gì đó dọc theo dòng "không tìm thấy tập tin pack.json". Xin vui lòng xem cập nhật của tôi cũng.
dsljanus

2
@dsljanus Và bạn đang chạy npm từ đâu vậy? Đăng toàn bộ dockerfile của bạn ... Btw không sửa đổi nhiều bản cập nhật như thế này trong các câu hỏi, điều đó thực sự khó chịu khi chuyển từ một vấn đề sang một vấn đề hoàn toàn khác. Mục đích của SF là đăng câu hỏi rõ ràng để có câu trả lời rõ ràng.
Xavier Lucas

1
@dsljanus Ok, đó là vấn đề, đừng sử dụng RUN cdmà hãy sử dụng WORKDIRđể thư mục hiện tại được ghi nhớ giữa mỗi bước. Một dockerfile không nhiều hơn một trình bao bọc cho docker run + docker commit để mỗi bước được chạy độc lập trên lớp trước đó. Điều này có nghĩa là pwd bằng /trong mỗi bước nếu bạn không sử dụng lệnh này.
Xavier Lucas

41

Đối với tôi thư mục nằm trong ngữ cảnh chính xác, chỉ có nó được bao gồm trong .dockerignoretệp (ẩn) trong thư mục gốc của dự án. Điều này dẫn đến thông báo lỗi:

lstat mydir/myfile.ext: no such file or directory

3
ý bạn là .dockerignoresao điều đó vừa xảy ra với tôi
Martín Coll

5
Ban phước cho bạn Có toàn bộ thư mục tôi đã bỏ qua rằng tôi đã quên và nó đã phá vỡ bản dựng của tôi. Là một lưu ý nhỏ, bạn có thể bỏ qua một tệp duy nhất trong một thư mục với: !path/to/my/filengay cả khi pathđang ở trong .dockerignore.
hjc1710

Đây là một người tốt.
Gudlaugur Egilsson

Không thể bày tỏ tôi biết ơn bạn như thế nào vì điều này, đã hành hạ bản thân mình suốt cả ngày qua. Vẫn không thể hiểu được tại sao Công cụ VS cho docker bao gồm một .dockerignore có * trong đó
bilal.haider

Không thể bình chọn nó đủ!
kmansoor

7

Đối với tôi vấn đề là tôi đã sử dụng docker build - < Dockerfile

Từ tài liệu Lưu ý: Nếu bạn xây dựng bằng STDIN ( docker build - < somefile), không có ngữ cảnh xây dựng, vì vậy không thể sử dụng COPY.


1

Như câu trả lời của Xavier Lucas [cực kỳ hữu ích] đã nêu, bạn không thể sử dụng COPY hoặc ADD từ một thư mục bên ngoài ngữ cảnh xây dựng của bạn (thư mục bạn chạy "docker build" từ, phải cùng thư mục với .Dockerfile của bạn). Ngay cả khi bạn cố gắng sử dụng một liên kết tượng trưng, ​​nó sẽ không hoạt động.

Lưu ý: Điều này dành riêng cho POSIX (Linux, Unix, Mac, Có thể là Hệ thống con Linux cho Windows). Bạn có thể làm tương tự trong Windows bằng cách sử dụng JUNCTION.

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

Nguy hiểm: Sử dụng điều này sẽ làm cho dự án docker của bạn cụ thể cho máy chủ lưu trữ. Bạn gần như không bao giờ muốn làm điều này! Xử lý cẩn thận.

Ứng dụng: Học tập, thử nghiệm trong môi trường phát triển

Điều này đã lừa tôi. cp -al sao chép cấu trúc thư mục và tạo liên kết cứng cho tất cả các tệp. Khi bạn hoàn thành chạy "rm -rf ./src_directory" để xóa nó.


Mục đích của tôi: Sao chép các gói được lưu trong bộ nhớ cache trên hệ thống tệp cục bộ vào hình ảnh docker của tôi. Cài đặt các công cụ tôi cần (nó sẽ sử dụng bộ đệm hoặc tải xuống mới). Sau đó, tôi xóa bộ đệm đó trong hình ảnh và xóa các liên kết cứng trên máy chủ. Nếu máy chủ không có những tập tin đó, đừng lo lắng. Nhưng tôi có băng thông hạn chế và không gian ổ đĩa hạn chế. Đây có phải là một sử dụng chấp nhận được?
TamusJRoyce

1

Tôi đã chạy vào vấn đề này và phát hiện ra rằng tôi có thể thêm một bối cảnh vào biến xây dựng để tải (các) Dockerfile của tôi từ các thư mục khác. Điều này cho phép tôi thay đổi cấu trúc tệp Docker mặc định của mình thêm một chút theo ý thích. Đây là một đoạn trích từ docker-compose.yml của tôi:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

Bằng cách thêm ngữ cảnh, tôi có thể xác định vị trí các tệp sẽ được tham chiếu. Bạn có thể tham khảo tài liệu Docker tại đây: https://docs.docker.com/compose/compose-file/#context

Hi vọng điêu nay co ich!


0

Đối với tôi, vấn đề là tên tệp tôi đã thêm có một khoảng trắng ở cuối. Một đổi tên đã sửa nó.


0

Đối với lỗi sau,

COPY failed: stat

Tôi đã nhận nó xung quanh bằng cách khởi động lại dịch vụ docker.


0

Cuối cùng tôi đã giải quyết vấn đề này trong trường hợp của tôi là Dockerfile thực thi bản sao ở cấp độ sâu hơn của dự án. Vì vậy, tôi nhận ra rằng đường dẫn xây dựng của máy chủ được thể hiện liên quan đến vị trí tệp của Dockerfile.


0

Điều này xảy ra với tôi khi cố chạy tệp docker từ một thư mục khác.

Tôi đã có COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryvà quản lý để giải quyết điều này bằng cách chỉ định tệp docker.

Chạy docker build . -f docker/development/Dockerfilelàm việc.

Nhưng việc chạy Runningdocker xây dựng docker / Development / Dockerfile` gây ra vấn đề này.

-fhoặc --fileđể xác định tên và vị trí của Dockerfile.

Ban đầu nó thấy lạ vì khi tôi có Dockerfiletrong thư mục gốc của ứng dụng thì nó hoạt động tốt. Điều này sẽ giúp nếu bạn muốn quản lý các tập tin docker môi trường của bạn tốt hơn một chút.


0

Tệp không chỉ phải ở trong một thư mục trong ngữ cảnh xây dựng hiện tại, mà tệp không thể là một liên kết mềm đến một tệp bên ngoài bối cảnh xây dựng.

Tôi đã có một liên kết đến một tập tin trong thư mục nhà của tôi, và liên kết là trong thư mục dự án. Sau khi tôi xóa liên kết và chuyển tệp được liên kết vào dự án ( rm mylink ; mv ~/myrealfile ./), thì nó hoạt động.


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.