2017-10-31 36 views
5

Tôi đang cố gắng tạo hình ảnh Docker mới không còn sử dụng khối lượng từ vùng chứa đang chạy sử dụng hình ảnh. Khối lượng được tạo ra bằng cách sử dụng tập tin docker-compose, không phải Dockerfile. Vấn đề là, khi tôi khởi chạy một vùng chứa mới thông qua tệp docker-compose.yml mới, nó vẫn có các ổ đĩa được ánh xạ. Tôi vẫn cần phải giữ những tập này và các thùng chứa/hình ảnh gốc sử dụng chúng. Ngoài ra, nếu có thể, tôi muốn tiếp tục sử dụng cùng một hình ảnh docker, chỉ cần thêm phiên bản mới hoặc mới nhất. Dưới đây là các bước tôi đã sử dụng:Docker soạn tái sử dụng khối lượng

Phiên bản mới của một hình ảnh hiện:

docker commit <image id> existingImage:new-version 

Tạo một hình ảnh mới từ container đang chạy hiện tại:

docker commit <Image ID> newimage 

Tạo mới Docker-compose.yml không có khối lượng xác định và chạy docker-compose với tên dự án khác

docker-compose -p <new project name> 

Chạy mà không có docker-compose, chỉ cần sử dụng docker run:

docker run -d -p 8093:80 <img>:<version> 

Bất cứ lúc nào tôi chạy bất kỳ sự kết hợp của các tập này vẫn được ánh xạ từ hình ảnh gốc. Vì vậy, câu hỏi của tôi là, làm thế nào để tôi tạo ra một container từ một hình ảnh mà đã từng có khối lượng bản đồ nhưng tôi không còn muốn sử dụng khối lượng?

Edit: điều bổ sung Tôi đã thử:

  • Dừng container, loại bỏ container, khởi động lại Docker, chạy Docker soạn lại. Không may mắn.

Chỉnh sửa 2: Đã quyết định bắt đầu lại trên hình ảnh. Sử dụng hình ảnh cơ sở, đã khởi chạy vùng chứa với trình cập nhật docker đã tạo tệp có sử dụng hình ảnh hiện không liên quan. Chạy docker-compose -f up -d -> STILL có cùng khối lượng được ánh xạ mặc dù hình ảnh không (và không bao giờ có) bất kỳ khối lượng nào được ánh xạ và tệp docker-compose.yml hiện tại không ánh xạ các tệp. Nó trông giống như bộ đệm docker-compose những gì khối lượng được ánh xạ cho các dự án.

Sau khi tìm kiếm cho các tùy chọn bộ nhớ đệm trong Docker-soạn, tôi đã xem qua bài viết này: How to get docker-compose to always re-create containers from fresh images? mà dường như để giải quyết các vấn đề về hình ảnh bộ nhớ đệm nhưng không đựng bộ nhớ đệm khối lượng

+0

Bạn không nên sử dụng 'docker commit' để tạo hình ảnh. Sử dụng một 'Dockerfile' và' docker build'. – BMitch

+0

Tại sao không? Điều đó thực sự không trả lời câu hỏi của tôi và có thể là một phần của một cuộc trò chuyện đầy đủ khác. –

+0

Bởi vì nó không thể duy trì hoặc dễ dàng tái sản xuất. Nếu hình ảnh của bạn đã từng bị xóa hoặc bạn phạm sai lầm, bạn không thể quay lại. Đó là một mùi mã của cố gắng để duy trì container theo cách bạn sẽ cài đặt một máy chủ. Nó không phải là một câu trả lời cho câu hỏi của bạn, đó là lý do tại sao nó là một bình luận ở đây. – BMitch

Trả lời

2

Theo một bài đăng SO khác, những gì tôi đang cố gắng làm là không thể. Để tham khảo trong tương lai, người ta không thể đính kèm khối lượng vào một hình ảnh, và sau đó quyết định loại bỏ chúng. Một hình ảnh mới phải được tạo ra mà không có khối lượng thay thế. Tham chiếu: How to remove configure volumes in docker images

+0

Tôi đã giải thích sai câu hỏi của bạn, không nhận ra bạn đã xác định khối lượng bên trong hình ảnh của bạn. Cá nhân tôi khuyên bạn nên chống lại thực hành này vì tất cả các vấn đề mà nó tạo ra, bao gồm cả vấn đề bạn đang thấy: khi khối lượng được xác định trên một hình ảnh, nó không thể không được xác định. https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/ – BMitch

1

Để loại bỏ khối lượng cùng với các container được sử dụng bởi docker-compose , sử dụng docker-compose down -v.

Để bắt đầu vùng chứa với docker-compose, hãy giữ nguyên khối lượng hiện có của bạn, nhưng không sử dụng các ổ đĩa đó, bạn nên thay đổi tên dự án của mình. Bạn có thể sử dụng docker-compose -p new_project_name up -d cho điều đó.


Edit: đây là một ví dụ cho thấy cách Docker-soạn không tái sử dụng khối lượng đặt tên giữa các dự án khác nhau, nhưng nó không tái sử dụng và duy trì khối lượng, trừ khi bạn làm một down -v:

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating volume "proj1_data" with default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
71f2eb516f71  busybox    "tail -f /dev/null"  5 seconds ago  Up 2 seconds         proj1_test_1 

$ docker exec -it 71f /bin/sh 
/# ls /data 
/# echo "Hello proj1" >/data/data.txt 
/# exit 

Khối lượng tại là dân cư, cho phép dừng và bắt đầu một vùng chứa mới để hiển thị nội dung đó tồn tại:

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 

$ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d 
Creating network "proj1_default" with the default driver 
Creating proj1_test_1 ... 
Creating proj1_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
311900fd3d27  busybox    "tail -f /dev/null"  5 seconds ago  Up 3 seconds         proj1_test_1 

$ docker exec -it 311 /bin/sh 
/# cat /data/data.txt 
Hello proj1 
/# exit 

Có khối lượng ổn định dự kiến, cho phép chạy một dự án khác tại đồng thời hiển thị khối lượng sẽ độc lập:

$ docker-compose -p proj2 -f docker-compose.vol-named.yml up -d 
Creating network "proj2_default" with the default driver 
Creating volume "proj2_data" with default driver 
Creating proj2_test_1 ... 
Creating proj2_test_1 ... done 

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
d39e6fc51436  busybox    "tail -f /dev/null"  4 seconds ago  Up 2 seconds         proj2_test_1 
311900fd3d27  busybox    "tail -f /dev/null"  33 seconds ago  Up 32 seconds        proj1_test_1 

$ docker exec -it d39 /bin/sh 
/# ls -al /data 
total 8 
drwxr-xr-x 2 root  root   4096 Nov 6 19:56 . 
drwxr-xr-x 1 root  root   4096 Nov 6 19:56 .. 
/# exit 

Khối lượng hoàn toàn trống trong dự án mới. Hãy cùng dọn dẹp.

$ docker-compose -p proj2 -f docker-compose.vol-named.yml down -v 
Stopping proj2_test_1 ... 
Stopping proj2_test_1 ... done 
Removing proj2_test_1 ... done 
Removing network proj2_default 
Removing volume proj2_data 

$ docker volume ls 
DRIVER    VOLUME NAME 
local    proj1_data 

Lưu ý khối lượng có trong proj1 từ trước.

$ docker-compose -p proj1 -f docker-compose.vol-named.yml down -v 
Stopping proj1_test_1 ... done 
Removing proj1_test_1 ... done 
Removing network proj1_default 
Removing volume proj1_data 

$ docker volume ls 
DRIVER    VOLUME NAME 

Tuy nhiên, xóa down -v xóa khối lượng.

+0

Thay đổi tên dự án không hoạt động. Nếu tôi cam kết hình ảnh và chạy nó hoàn toàn riêng biệt, I.E. một tệp docker-compose mới, một thư mục khác hoặc thậm chí chỉ sử dụng docker run, các volume vẫn tồn tại. –

+0

Tôi không trải nghiệm như vậy. Có lẽ bạn có thể chia sẻ [mcve] (http://stackoverflow.com/help/mcve). – BMitch

+0

Tôi hiểu rằng docker-compose không duy trì khối lượng như bạn đã đăng, nhưng đó không phải là vấn đề của tôi. Vấn đề tôi gặp phải là hình ảnh Docker giữ lại thông tin khối lượng ánh xạ khi sử dụng docker commit. –

Các vấn đề liên quan