Cách chỉnh sửa tệp trong vùng chứa docker đã dừng / không khởi động


93

Đang cố gắng sửa lỗi và gỡ lỗi các sự cố với ứng dụng của tôi được chia thành nhiều vùng chứa, tôi thường xuyên chỉnh sửa tệp trong các vùng chứa:

  • hoặc tôi hoàn toàn lười cài đặt nano và chỉnh sửa trực tiếp trong vùng chứa hoặc

  • Tôi docker cp tệp ra khỏi vùng chứa, chỉnh sửa nó, sao chép lại và khởi động lại vùng chứa

Đó là các bước trung gian trước khi đến với nội dung mới để xây dựng vùng chứa, mất nhiều thời gian hơn so với việc làm ở trên (tất nhiên chỉ là trung gian / loay hoay).

Bây giờ tôi thường xuyên phá vỡ chương trình bắt đầu của vùng chứa, trong các trường hợp vi phạm là tập lệnh nút hoặc tập lệnh máy chủ web python, cả hai thường không thành công do lỗi cú pháp.

Có cách nào để cứu những thùng chứa đó không? Vì chúng không bắt đầu, tôi không thể gắn người thực thi vào chúng, và do đó chúng bị mất trước tôi. Sau đó, tôi đi theo lộ trình rm / rmi / build / run sau khi sửa tệp vi phạm trong đầu vào bản dựng.

Làm cách nào để có thể chỉnh sửa tệp trong vùng chứa đã dừng, hoặc gộp chúng vào hoặc bắt đầu một trình bao trong vùng chứa đã dừng - bất kỳ điều gì cho phép tôi sửa vùng chứa này?

(Có vẻ như làm việc trên một máy tính từ xa và phá vỡ cấu hình mạng - kết nối bị mất "vĩnh viễn" theo cách này và người ta phải sử dụng dự phòng, nếu điều đó tồn tại.)

Cách chỉnh sửa tệp vùng chứa Docker từ máy chủ lưu trữ? trông có vẻ phù hợp nhưng đã lỗi thời.


Đây cũng có thể là một giải pháp thay thế stackoverflow.com/a/32353134/586754 - hy vọng sẽ có giải pháp tốt hơn.
Andreas Reiff,

1
có thể bạn nên cân nhắc việc gắn một ổ đĩa để bạn có thể chỉnh sửa tệp trên máy chủ của mình thay vì bên trong vùng chứa. Khi hạnh phúc với mã của bạn, bạn có thể tự do docker cpcác tập tin vào container (hoặc xây dựng một hình ảnh mới)
Thomasleveil

Vâng, điều này sẽ hơi muộn nếu tôi không sắp xếp mọi thứ như thế này ngay từ đầu. Tôi nghĩ điều này không có tác dụng phục hồi.
Andreas Reiff

Nhiều người đọc sẽ chỉ muốn xem các tập tin hơn là chỉnh sửa chúng. Trong những trường hợp này, bạn có thể sử dụng docker commitlệnh để ngắt một hình ảnh mới. name=$(docker commit); docker run -it $name /bin/shsẽ làm những gì bạn muốn.
Att Righ

Vì vậy, có vẻ như hệ thống tệp của các vùng chứa bị dừng ở cuối tương đối lâu dài?
Webwoman

Câu trả lời:


138

Tôi đã gặp sự cố với vùng chứa không khởi động do thay đổi cấu hình không hợp lệ mà tôi đã thực hiện. Tôi đã có thể sao chép tệp ra khỏi vùng chứa đã dừng và chỉnh sửa nó. cái gì đó như:

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(sửa tệp)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

22
Đây là câu trả lời được chấp nhận. Vì một số lý do, tôi không nghĩ rằng CP hoạt động trên các container bị dừng. Đẹp!
Gần

Hoàn hảo. Tôi đã sao chép một tệp từ vùng chứa (tôi biết đường dẫn của nó) rồi chỉnh sửa nó, sau đó sao chép lại vào vùng chứa đến cùng một vị trí. Đã làm cho tôi! Cảm ơn!
Nawaz

Có cách nào để xóa tệp không?
kodlan

1
@kodlan Chỉ khi nó chỉ xuất hiện trong phần UpperDirbạn nhận được docker container inspect- bạn phải thử nghiệm để xem cách hệ thống lớp phủ biểu thị các tệp trong cấu trúc cơ bản đã bị xóa ở lớp trên.
Tim Baverstock

Cảm ơn, điều này đã giúp tôi sửa vùng chứa MySQL của mình đang chạy trong docker trên macOS.
mazedlx

60

Trả lời câu hỏi của chính mình .. vẫn hy vọng câu trả lời tốt hơn từ một người có kiến ​​thức hơn !!

Có 2 khả năng.

1) Chỉnh sửa hệ thống tệp trực tiếp trên máy chủ . Điều này hơi nguy hiểm và có khả năng phá vỡ hoàn toàn vùng chứa, có thể là dữ liệu khác tùy thuộc vào sự cố.

2) Thay đổi tập lệnh khởi động thành một thứ gì đó không bao giờ bị lỗi như khởi động bash, thực hiện các bản sửa lỗi / chỉnh sửa và sau đó thay đổi lại chương trình khởi động thành chương trình mong muốn (như nút hoặc bất kỳ thứ gì trước đó).

Thêm chi tiết:

1) Sử dụng

docker ps

để tìm các vùng chứa đang chạy hoặc

docker ps -a

để tìm tất cả các vùng chứa (bao gồm cả những vùng chứa đã dừng) và

docker inspect (containername)

tìm kiếm "Id", một trong những giá trị đầu tiên.

Đây là phần chứa chi tiết triển khai và có thể thay đổi, hãy lưu ý rằng bạn có thể mất vùng chứa theo cách này.

Đi đến

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

và ở đó bạn sẽ tìm thấy tất cả các tệp được thay đổi theo hình ảnh mà vùng chứa dựa trên. Bạn có thể ghi đè tệp, thêm hoặc chỉnh sửa tệp.

Một lần nữa, tôi không giới thiệu điều này.

2) Như được mô tả tại https://stackoverflow.com/a/32353134/586754, bạn có thể tìm thấy cấu hình json config.json tại một đường dẫn như

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Ở đó bạn có thể thay đổi các args từ ví dụ: "nodejs app.js" thành "/ bin / bash". Bây giờ khởi động lại dịch vụ docker và khởi động vùng chứa (bạn sẽ thấy rằng nó bây giờ đã khởi động chính xác). Bạn nên sử dụng

docker start -i (containername)

để đảm bảo nó không bỏ ngay lập tức. Bây giờ bạn có thể làm việc với vùng chứa và / hoặc sau đó đính kèm với

docker exec -ti (containername) /bin/bash

Ngoài ra, docker cp khá hữu ích để sao chép các tệp đã được chỉnh sửa bên ngoài vùng chứa.

Ngoài ra, người ta chỉ nên quay trở lại các biện pháp đó nếu dù sao thì thùng chứa ít nhiều bị "mất", vì vậy bất kỳ thay đổi nào cũng sẽ là một cải tiến.


Vẫn hy vọng có câu trả lời tốt hơn - vì vậy hãy đưa ra một câu trả lời, tôi cũng sẽ di chuyển thẻ "ansered".
Andreas Reiff

Tôi sử dụng cách thứ hai và tôi phải khởi động lại dịch vụ Docker để buộc ghi đè lên các config.jsonfile mỗi khi tôi thay đổi nội dung họ
Vitaly Isaev

2
Tôi có config.v2.json và mỗi khi tôi khởi động vùng chứa zombie, nó sẽ hoàn nguyên bản cập nhật Path / EntryPoint của tôi và chết một lần nữa. Sử dụng "docker cp" để cập nhật tập lệnh entrypoint.sh để chỉ chạy bash đã sửa nó.
Curtis Yallop

@CurtisYallop Tôi đang gặp điều tương tự. Làm thế nào bạn giải quyết nó?
Brett McLain

1
@BrettMcLain Tôi đã sử dụng bộ docker cp thay vì chỉnh sửa nó trên máy chủ. Như thế này: Tìm vị trí tập lệnh điểm nhập: "docker Kiểm tra container_name | grep Entry". Nhận tập lệnh: "docker cp container_name: /entrypoint.sh ./". (Chỉnh sửa nó) Đặt lại tập lệnh vào vùng chứa: "docker cp entrypoint.sh container_name: /entrypoint.sh". Bạn có thể làm cho điểm nhập chạy bash hoặc chạy vòng lặp ngủ, ví dụ: "while:; do sleep 10; done". Dòng tập lệnh đầu tiên phải là "#! / Bin / bash".
Curtis Yallop

9

Bạn có thể chỉnh sửa trực tiếp hệ thống tệp vùng chứa, nhưng tôi không biết đó có phải là ý kiến ​​hay không. Trước tiên, bạn cần tìm đường dẫn của thư mục được sử dụng làm thư mục gốc thời gian chạy cho vùng chứa. Chạy đi docker container inspect id/name. Tìm khóa UpperDirtrong đầu ra JSON.

Đó là thư mục của bạn.


Đã tìm thấy thư mục nhưng không chứa tất cả các tệp.
aioobe

Đó là OverlayFS, vì vậy các tệp của bạn phải nằm trong một tệp trên các thư mục đó.
Tejas Sarade

Ví dụ: tên thư mục có thể khác với "UpperDir", trong trường hợp của tôi, nó là Nguồn. Nhưng nó đã hoạt động!
Rajni Kewlani

0

Nếu bạn đang cố gắng khởi động lại vùng chứa đã dừng và cần thay đổi vùng chứa do định cấu hình sai nhưng vùng chứa không khởi động, bạn có thể thực hiện các thao tác sau bằng cách sử dụng lệnh "docker cp" (tương tự như đề xuất trước đó). Quy trình này cho phép bạn xóa tệp và thực hiện bất kỳ thay đổi nào khác cần thiết. Nếu may mắn, bạn có thể bỏ qua rất nhiều bước dưới đây.

  1. Sử dụng trình kiểm tra docker để tìm điểm nhập, (được đặt tên là Đường dẫn trong một số phiên bản)
  2. Tạo bản sao của quá trình chạy bằng docker
  3. Nhập bản sao bằng trình xử lý docker -ti bash (if * nix container)
  4. Xác định vị trí tệp entrypoint bằng cách tìm bản sao để tìm
  5. Sao chép tập lệnh entrypoint cũ bằng docker cp: ./
  6. Sửa đổi hoặc tạo một tập lệnh entrypoint mới chẳng hạn

    #!/bin/bash tail -f /etc/hosts

  7. đảm bảo tập lệnh có quyền thực thi
  8. Thay thế entrypoint cũ bằng docker cp ./:
  9. khởi động vùng chứa cũ bằng cách sử dụng start
  10. làm lại các bước 6-9 cho đến khi bắt đầu
  11. Khắc phục sự cố trong vùng chứa
  12. Khôi phục điểm nhập nếu cần và thực hiện lại các bước 6-9 theo yêu cầu
  13. Xóa bản sao nếu cần
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.