chỉnh sửa file trong thư mục /usr/bin/ của docker
Chào các bạn. Mình dùng docker pull và run một images trên mạng về. Sau đó dùng lệnh cat /usr/bin/abc.sh để xem một file abc.sh thì xem được. Giờ mình muốn download, chỉnh sửa, lưu cái file đó vào thư mục /usr/bin trong docker thì có được không? Có bạn nào đã làm tương tự như vậy không? Vui lòng chia sẻ cho mình với. Mình đã tìm nó hơn 1 tuần nay rồi nhưng không ra kết quả gì? Cảm ơn mọi sự chia sẻ của các bạn/
1 CÂU TRẢ LỜI
Theo mình hiểu thì bạn đang gặp 2 vấn đề,
- Làm thế nào để chỉnh sửa file
abc.sh
- Làm thế nào để lưu lại nội dung sau khi chỉnh sửa vào image
Về hướng giải quyết thì sẽ như sau:
Chỉnh sửa file abc.sh
Nhìn chung sẽ rất khó để "mò" ra được file này nằm ở đâu trong máy của bạn, bạn nên chỉnh sửa trực tiếp trong container thôi. Bạn có thể dùng các command line editor như nano
, hay vim
để chỉnh sửa trực tiếp, rồi lưu lại, đây là cách nhanh chóng và dễ dàng nhất rồi
Nếu bạn không quen với việc sử dụng các terminal editor trên, thì bạn có thể đi theo hướng khác là mount một thư mục từ bên ngoài máy host của bạn vào bên trong container, bằng tham số -v
khi chạy: docker run -ti -v host_folder:/temporary image_name /bin/bash
. Với việc sử dụng Docker Volume thông qua option -v
như vậy, thì thư mục trong container sẽ được link với thư mục ngoài máy host, bạn chỉ cần dùng lệnh copy file từ /usr/bin/
vào thư mục /temporary
, rồi sửa bằng notepad ở bên ngoài, sau đó từ /temporary
copy ngược lại /usr/bin
là được.
Lưu lại nội dung vào image
Sau khi edit được nội dung file, bạn có thể lưu lại trạng thái của container hiện tại, để tạo thành image mới, bằng lệnh docker commit
. Về cú pháp của lệnh này, bạn có thể tham khảo ở trang document của Docker
docker commit -m "Edit abc.sh file" your_container_id new_image_name
Tuy nhiên, cách thực hiện việc thay đổi nội dung 1 image bằng cách edit trực tiếp bên trong container rồi lưu lại bằng docker commit
không phải là một cách hay, và không được khuyến khích làm. Nếu image của bạn đang dùng có public Dockerfile, bạn nên sửa trực tiếp từ file Dockerfile đó, và build lại image của riêng mình thì hơn
Cảm ơn bạn rất nhiều. Mình đang thực hiện như bạn hướng dẫn. Tuy nhiên vẫn chưa có kết quả. Nếu có thể để lại cho mình địa chỉ email không?
@babatnvn Nếu có vấn đề gì bạn cứ để lại comment ở trên đây đi, mình không giải quyết được thì sẽ có người khác thấy và giúp đỡ bạn mà
@thangtd90 bạn ơi. Khi mình dùng vim /usr/bin/abc.sh thì nó mở ra file trống. Có phải file abc.sh kia nó ở trên host_path nên không mở được không?
@babatnvn Ý bạn là gõ cat /usr/bin/abc.sh
thì nó ra nội dung, còn vim /usr/bin/abc.sh
thì nó không mở file ra à Lúc đó thì nó báo lỗi là gì nhỉ, bạn chụp ảnh màn hình đoạn lỗi đó giúp mình được không?
Với lại bạn check lại xem trong container của mình đã có vim
chưa nhỉ?
@thangtd90 Gõ cat /usr/bin/abc.sh thì nó ra nội dung, còn vim /usr/bin/abc.sh thì nó không mở file ra mà mở ra 1 file trống như hình dưới bạn ạ
Hình khi gõ cat
.
Hình khi gõ vim
@babatnvn chạy lệnh cat
mà ra nội dung mà vim
lại không ra thì lạ quá nhỉ Bạn có chắc là mình đang chạy vim
cũng ngay bên trong Docker container đó không nhỉ
@thangtd90 Mình cảm ơn bạn nhiều. Mình đã hiểu vấn đề và vim được file đó. Bạn ơi giờ vim được rồi. mình nhấn INSERT và chỉnh sửa sau đó dùng lệnh ":wq - lưu và thoát khỏi chế độ soạn thảo". tại sao nó không lưu cái mình đã sửa mà vẫn giữ nguyên tình trạng ban đầu. Hay do lệnh hả bạn?
tại sao nó không lưu cái mình đã sửa mà vẫn giữ nguyên tình trạng ban đầu
cái này là bạn sửa xong, dùng :wq
để save file lại, rồi ngay lập tức dùng lệnh vim
để mở lại file thì không được à,
hay bạn thoát ra ngoài, dựng container mới lên thì thấy file vẫn như cũ vậy
@thangtd90 cái này là mình sửa xong, dùng :wq để save file lại, rồi ngay lập tức dùng lệnh vim để mở lại file thì không thấy hiển thị chỗ đã sửa. Mình cũng run cái image đó cũng thấy không hiển thị chỗ đã sửa.
@babatnvn Trước tiên, bạn thử dùng :w
thôi xem sao, xem file đó đã chắc chắn được lưu lại hay chưa
khi save lại thì nó sẽ có thông báo ở phía dưới, góc trái, như thế này. Bạn chú ý sẽ thấy có thông báo là written đấy.
đã giống như bạn nói. Nhưng sau đó mình dùng lệnh cat xem lại không có gì thay đổi..Không biết mình còn sai ở đâu nữa bạn nhỉ?
@babatnvn Nếu đã save lại được như thế thì mình nghĩ file đó trong container của bạn đã được thay đổi rồi, bạn thử check lại ngay trong container đó xem
Còn ở trong container khác dựng từ cùng image thì vẫn chưa thể có sự thay đổi được, bạn cần commit vào image đó, như trong câu trả lời phía trên của mình ý.
@thangtd90 Bạn ơi. Vẫn không được bạn ạ. Mình commit vào image đó sao vẫn không được ? Đầu tiên mình sửa file đó=> lưu lại => commit vào cái image đó với cái tên imge mới
- commit =>image mới
- Đã có Image mới
- kiểm tra trong cái container mới này không thấy nó thay đổi gì cả
Bạn có thể nói rõ hơn về câu hỏi được không, như download là download từ đâu về đâu nhỉ
ngoài ra
tức là là lưu vào đâu vậy bạn, lưu vào thư mục trong Docker Container, hay lưu hẳn lại trong Docker Image, để lần sau khởi động container mới từ image đó là sẽ có file luôn
@thangtd90 Cái images kia mình download ở trên trang http://github.com/ bạn ạ. Mình muốn lưu file abc.sh vào thư mục /usr/bin trong docker image.
@babatnvn File
abc.sh
của bạn đang nằm ở đâu vậy?Nó có sẵn trong image rồi, giờ bạn muốn chỉnh sửa, và lưu lại trong image đó à
@thangtd90 File abc.sh kia mình cũng chưa biết nó nằm ở chỗ nào? Mình dùng lệnh which abc.sh để kiểm tra thì nó nằm ở đường dẫn /usr/bin/abc.sh.Mình dùng cat /usr/bin/abc.sh thì nó mở ra cho mình xem. Nhưng mình mở nó bằng notepad thì nó bảo không tìm thấy file. Bạn ơi. File abc.sh kia nằm ở trên thư mục ảo hóa container_path. Giờ mình muốn chỉnh sửa, lưu lại file abc.sh vào trong image
@babatnvn à, mình hiểu vấn đề của bạn rồi, đợi chút để mình viết câu trả lời hoàn chỉnh nhé