Làm cách nào để chỉnh sửa tệp sau khi tôi shell sang Docker container?


518

Tôi đã bóc vỏ thành công một container Docker bằng cách sử dụng:

docker exec -i -t 69f1711a205e bash

Bây giờ tôi cần chỉnh sửa tập tin và tôi không có bất kỳ biên tập viên nào bên trong:

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

Làm cách nào để chỉnh sửa tập tin?


@Opal Tôi sử dụng confluent / postgres-bw: 0.1
Igor Barinov

2
@Opal apt-get cài đặt vim hoạt động. cảm ơn!
Igor Barinov

3
vậy tại sao không tạo Dockerfilevà bao gồm lệnh cài đặt apt-get và tạo vùng chứa của riêng bạn? Docker container được thiết kế như thế này, không phải theo cách của bạn.
BMW

1
Docker nên cài đặt cho thuê trên trình chỉnh sửa thử nghiệm, ít nhất là vim theo mặc định
Bawantha

Câu trả lời:


724

Như trong các bình luận, không có bộ soạn thảo mặc định - lạ - $EDITORbiến môi trường trống. Bạn có thể đăng nhập vào một container với:

docker exec -it <container> bash

Và chạy:

apt-get update
apt-get install vim

Hoặc sử dụng Dockerfile sau:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Hình ảnh Docker được phân phối cắt ở mức tối thiểu - vì vậy không có trình chỉnh sửa nào được cài đặt với container được vận chuyển. Đó là lý do tại sao cần phải cài đặt bằng tay.

BIÊN TẬP

Tôi cũng khuyến khích bạn đọc bài viết của tôi về chủ đề này.


3
Những gì bạn cần là gắn một tập: docs.docker.com/userguide/dockervolume
Opal

16
Tôi cần phải đăng nhập như một root để thực hiện điều này docker exec -u 0 -it container_name bash.
Tiếng Anh.

34
Như với docker, tốt hơn để cài đặt vim-tinythay thế, có lẽ.
ryenus

2
Có lẽ bạn có thể cân nhắc việc không cài đặt trình chỉnh sửa trong mỗi vùng chứa mà bạn đính kèm, mà chỉ một lần trên máy chủ docker. Như các nhà bình luận khác đã đề cập, bạn có thể gắn âm lượng, vì vậy bạn có thể chỉnh sửa các tệp sẽ được gắn hoặc điều hướng đến chính dữ liệu chứa và chỉnh sửa các tệp trong/var/lib/docker/
Pitt

4
Tôi chỉ muốn thay đổi một cấu hình từ true thành false trong container. apt-getkhông hoạt động do vấn đề cấp phép bên trong container, vì vậy tôi đã thử sed -i 's/texttobechanged/textwanted/g' filename. Nó làm việc cho tôi.
Amreesh Tyagi

420

Nếu bạn không muốn thêm trình chỉnh sửa chỉ để thực hiện một vài thay đổi nhỏ (ví dụ: thay đổi cấu hình Tomcat), bạn chỉ có thể sử dụng:

docker cp <container>:/path/to/file.ext .

sao chép nó vào máy cục bộ của bạn (vào thư mục hiện tại của bạn). Sau đó chỉnh sửa tệp cục bộ bằng trình chỉnh sửa yêu thích của bạn và sau đó thực hiện

docker cp file.ext <container>:/path/to/file.ext

để thay thế các tập tin cũ.


21
@Igor Đây thực sự phải là giải pháp được chấp nhận vì đây là cách thích hợp để thực hiện mà không cần thêm các gói bổ sung vào thùng chứa của bạn, trong khi thêm các gói nên là một giải pháp thứ cấp.
Routhinator

1
Đối với các nền tảng Windows, bạn có thể sử dụng, ví dụ: docker cp <container>:C:\inetpub\wwwroot\Web.config .docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares

1
Cách giải quyết tốt đẹp cho mục đích thử nghiệm! Tôi không khuyên bạn nên làm điều đó trong sản xuất.
Michal Šípek

9
Và những gì bạn đề nghị cho sản xuất? Mọi người có nên chỉnh sửa các tập tin trong một thùng chứa tương tác trong sản xuất?
lucid_dreamer

4
Đáng lưu ý phương pháp này thay đổi quyền sở hữu tập tin. Có thể nhưng một chút khó khăn để thay đổi nó trở lại sau đó bằng cách đi vào container dưới dạng root ( docker exec -u 0 -it mycontainer bash) và sau đó chạy một chownlệnh.
Steve Chambers

91

Bạn có thể sử dụng catnếu nó được cài đặt, rất có thể sẽ là trường hợp nếu nó không phải là một thùng chứa nguyên / thô. Nó hoạt động trong một nhúm, và ok khi sao chép + dán vào một trình soạn thảo thích hợp cục bộ.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

catsẽ xuất ra mỗi dòng khi nhận được một dòng mới. Hãy chắc chắn để thêm một dòng mới cho dòng cuối cùng đó. ctrl-c gửi mộtSIGINT con mèo để thoát ra một cách duyên dáng. Từ các bình luận bạn thấy rằng bạn cũng có thể nhấn ctrl-d để biểu thị phần cuối của tệp ("không có thêm đầu vào nào nữa").

Một tùy chọn khác là một cái gì đó giống như infiltertiêm một quá trình vào không gian tên container với một số phép thuật ptrace: https://github.com/yadutaf/infilter


3
Điều này là vô cùng hữu ích nếu có vấn đề cho phép thấm nhuần!
La Mã

17
ctrl+Dlà tốt hơn so với ctrl+C. ctrl+Dgửi một EOF. Bạn không cần thêm một dòng mới vào cuối. Với ctrl+C, nếu bạn quên thêm dòng mới, bạn sẽ mất dòng cuối cùng!
wvducky

1
@wvducky Đẹp quá! Thậm chí còn tốt hơn. Có thể cần phải ctrl-d hai lần mặc dù.
meijsermans

52

Để giữ hình ảnh Docker của bạn nhỏ, không cài đặt các trình chỉnh sửa không cần thiết. Bạn có thể chỉnh sửa các tệp qua SSH từ máy chủ Docker sang vùng chứa:

vim scp://remoteuser@containerip//path/to/document

2
Cảm ơn bạn. Tôi muốn rời khỏi liên kết này mà giải thích rõ hơn về vim scp:// vim.wikia . Ngoài ra, để lấy địa chỉ IP của người chứa, bạn có thể sử dụngsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
Chỉ cần tự hỏi, tôi thực sự sử dụng "remoteuser", hay "docker"? Tôi đã thử: vim scp://docker@172.17.0.17//data/gitea/conf/app.inicũng như vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.inivà cả hai chỉ tạo một tệp mới, trống.
J. Scott Elblein

1
@ J.ScottElblein Điều này đòi hỏi phải cấu hình sshtrên bộ chứa docker của bạn trước. Xem blog.softwaremill.com/ . Nhưng bạn thường không muốn cài đặt sshtrong thùng chứa của bạn.
đĩa mềm

14

Đôi khi trước tiên bạn phải chạy container với root:

docker exec -ti --user root <container-id> /bin/bash

Sau đó, trong container, để cài đặt Vim hoặc một cái gì đó khác:

apt-get install vim

7

Tôi sử dụng "docker run" (không phải "docker exec") và tôi đang ở trong một khu vực hạn chế nơi chúng tôi không thể cài đặt trình chỉnh sửa. Nhưng tôi có một trình soạn thảo trên máy chủ Docker.

Cách giải quyết của tôi là: Liên kết gắn một ổ đĩa từ máy chủ Docker vào vùng chứa ( https://docs.docker.com/engine/reference/run/#/volume- Shared-filesystems ) và chỉnh sửa tệp bên ngoài vùng chứa. Nó trông như thế này:

docker run -v /outside/dir:/container/dir

Điều này chủ yếu để thử nghiệm và sau này tôi sẽ thay đổi tệp khi xây dựng hình ảnh.


6

Sau khi bạn bóc vỏ vào Docker container, chỉ cần gõ:

apt-get update
apt-get install nano

6

Bạn có thể mở tệp hiện có với

cat filename.extension

và sao chép tất cả các văn bản hiện có trên clipboard.

Sau đó xóa tập tin cũ với

rm filename.extension

hoặc đổi tên tập tin cũ với

mv old-filename.extension new-filename.extension

Tạo tập tin mới với

cat > new-file.extension

Sau đó dán tất cả văn bản được sao chép vào clipboard, nhấn Entervà thoát với lưu bằng cách nhấn ctrl+z. Và voila không cần phải cài đặt bất kỳ loại biên tập viên.


5

Bạn chỉ có thể chỉnh sửa tệp của mình trên máy chủ và nhanh chóng sao chép nó vào và chạy nó trong thùng chứa. Đây là lối tắt một dòng của tôi để sao chép và chạy tệp Python:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
Làm thế nào mà trả lời câu hỏi? - "Làm cách nào để chỉnh sửa tập tin?"
Peter Mortensen

4

Đối với các hoạt động chỉnh sửa phổ biến tôi thích cài đặt vi( vim-tiny ), chỉ sử dụng 1491 kB hoặc nanosử dụng 1707 kB .

Mặt khác vimsử dụng 28,9 MB .

Chúng ta phải nhớ rằng apt-get installđể làm việc, chúng ta phải làm updatelần đầu tiên, vì vậy:

apt-get update
apt-get install vim-tiny

Để bắt đầu trình chỉnh sửa trong CLI, chúng ta cần nhập vi.


2

Nếu bạn sử dụng Windows container và bạn muốn thay đổi bất kỳ tệp nào, bạn có thể nhận và sử dụng Vim trong bảng điều khiển Powershell một cách dễ dàng.

Để được bóc vỏ vào bộ chứa Docker của Windows bằng PowerShell:

docker exec -it <name> powershell

  • Đầu tiên cài đặt trình quản lý gói Chocolatey

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Cài đặt Vim

    choco install vim

  • Làm mới BIẾN MÔI TRƯỜNG MÔI TRƯỜNG Bạn có thể chỉ cần exitvà quay trở lại container

  • Đi đến vị trí tập tin và Vim nó vim file.txt


1

Đây là một loại khó khăn, nhưng trong một nhúm bạn có thể sử dụng sedhoặc awkthực hiện các chỉnh sửa nhỏ hoặc xóa văn bản. Tất nhiên, hãy cẩn thận với các mục tiêu regex của bạn và lưu ý rằng bạn có khả năng roottrên container của mình và có thể phải điều chỉnh lại các quyền.

Ví dụ: xóa một dòng đầy đủ có chứa văn bản khớp với biểu thức chính quy:

awk '!/targetText/' file.txt > temp && mv temp file.txt

(Hơn)


1

Một cách dễ dàng để chỉnh sửa một vài dòng sẽ là:

echo "deb http://deb.debian.org/debian stretch main" > sources.list

1

Xem tập tin chỉnh sửa Stack Overflow sed tại chỗ

Nó sẽ là một lựa chọn tốt ở đây, nếu:

  1. Để sửa đổi một tệp lớn, không thể sử dụng cat.
  2. Cài đặt Vim không được phép hoặc mất quá nhiều thời gian. Hoàn cảnh của tôi đang sử dụng hình ảnh MySQL 5,7 khi tôi muốn thay đổi my.cnftập tin, không có vim, vivà Vim cài đặt mất quá lâu (Trung Quốc Great Firewall). sedđược cung cấp trong hình ảnh, và nó khá đơn giản. Cách sử dụng của tôi là như thế

    sed -i /s/testtobechanged/textwanted/g filename

    Sử dụng man sedhoặc tìm kiếm các hướng dẫn khác để sử dụng phức tạp hơn.


1

Bạn có thể sử dụng catnếu được cài đặt, với các vi >khuẩn. Đây là thao tác:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

Bây giờ bạn có thể thấy kết quả với lệnh

cat file

0

Bạn cũng có thể sử dụng một thùng chứa đặc biệt sẽ chỉ chứa lệnh bạn cần: Vim. Tôi đã chọn python-vim . Nó giả định rằng dữ liệu bạn muốn chỉnh sửa nằm trong một thùng chứa dữ liệu được xây dựng với Dockerfile sau:

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

Bạn sẽ có thể chỉnh sửa dữ liệu của mình bằng cách gắn một khối Docker (src_volume) sẽ được chia sẻ bởi bộ chứa dữ liệu của bạn (src_data) và thùng chứa python-vim.

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

Bằng cách đó, bạn không thay đổi container của bạn. Bạn chỉ cần sử dụng một container đặc biệt cho công việc này.

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.