2015-07-24 31 views
7

Tôi đang cố gắng để xây dựng một vài container docker và tôi tìm thấy quá trình lặp lại của chỉnh sửa Dockerfile, và các kịch bản chạy bên trong nó, clunky. Tôi đang tìm kiếm các phương pháp hay nhất và tìm hiểu xem người khác đi như thế nào.Cách tốt nhất để lặp lại khi xây dựng một thùng chứa docker là gì?

quá trình ban đầu của tôi là:

  1. docker build -t mycontainer mycontainer
  2. docker run mycontainer
  3. docker exec -i -t < container id > "/bin/bash" # get into container to debug
  4. docker rm -v < container id >
  5. docker rmi mycontainer
  6. Lặp lại

Điều này cảm thấy tốn kém cho mỗi lần lặp lại, đặc biệt nếu đó là lỗi đánh máy.

quá trình thay thế này đòi hỏi một chút ít lặp:

  1. Install vim trong dockerfile
  2. docker run mycontainer
  3. docker exec -i -t < container id > "/bin/bash" # get into container to edit scripts
  4. docker cp để sao chép các tập tin đã chỉnh sửa ra khi hoàn tất.
  5. Nếu tôi cần chạy bất kỳ lệnh nào, tôi cẩn thận nhớ và cập nhật Dockerfile bên ngoài vùng chứa.
  6. Rebuild hình ảnh mà không vim

Điều này đòi hỏi lặp đi lặp lại ít hơn, nhưng không phải là không đau vì mọi thứ đều rất thủ công và tôi phải nhớ mà tập tin thay đổi và đã cập nhật.

+2

một sidenote, bạn nói 'docker exec -i -t "/bin/bash "# vào trong thùng chứa để gỡ lỗi' bạn có thể làm' docker exec -i -t $ (docker ps -lq) "/ bin/bash "' do đó, nó là tự động – user2915097

+1

trong thực tế, bạn nên làm 2 và 3 trong một lệnh 'docker run ... && docker exec ...' để bạn chắc chắn nhập vào container của bạn và không phải một số khác – user2915097

Trả lời

9

Tôi đã làm việc với Docker trong sản xuất kể từ 0,7 và tôi chắc chắn cảm thấy đau đớn của bạn.

Phát triển Dockerfile Workflow

Lưu ý: Tôi luôn luôn cài đặt vim trong container khi tôi đang phát triển tích cực. Tôi chỉ lấy nó ra khỏi Dockerfile khi tôi phát hành.

  1. Thiết lập màn hình tmux/gnu/iTerm/tiện ích bảng điều khiển chia dọc yêu thích của bạn.
  2. Trên giao diện điều khiển đúng tôi chạy:

    $ vim Dockerfile 
    
  3. Trên giao diện điều khiển bên trái tôi chạy:

    $ docker build -t username/imagename:latest . && docker run -it -name dev-1 username/imagename:latest 
    
  4. Bây giờ chia giao diện điều khiển bên trái theo chiều ngang, do đó chạy STDOUT là ở trên và một vỏ bên dưới. Ở đây bạn sẽ chạy:

    docker exec -it dev-1 
    

    và chỉnh sửa nội hoặc làm các xét nghiệm với:

    docker exec -it dev-1 <my command> 
    
  5. Mỗi khi bạn hài lòng với công việc của bạn với Dockerfile tiết kiệm (:wq!) và sau đó trong giao diện điều khiển chạy bên trái lệnh trên. Kiểm tra hành vi. Nếu bạn không hài lòng chạy:

    docker rm dev-1 
    

    rồi chỉnh sửa lại và lặp lại bướC# 3.

Định kỳ, khi tôi đã xây dựng quá nhiều hình ảnh hoặc container Tôi thực hiện như sau:

  • Hủy bỏ tất cả các container: docker rm $(docker ps -qa)
  • Hủy bỏ tất cả hình ảnh: docker rmi $(docker images -q)
+1

cảm ơn, còn tất cả các thùng chứa và hình ảnh bổ sung được tạo trong quá trình này thì sao? Bạn chỉ cần bỏ qua chúng? – dragonx

+1

Vâng, tôi bỏ qua chúng và xóa chúng đi. – Elijah

3

Tôi cho rằng các tệp bạn đang chỉnh sửa trong quy trình Thay thế là các tệp tạo nên một phần của ứng dụng bạn đang triển khai? Chẳng hạn như một kịch bản Bash hoặc Python?

Đó là trường hợp, bạn có thể gắn kết chúng dưới dạng ổ đĩa, trong quá trình gỡ lỗi của bạn, thay vì gắn chúng bên trong đế, để khi bạn chỉnh sửa chúng, chúng sẽ được thay đổi ngay trong docker và máy chủ.

Vì vậy, ví dụ, nếu mã của bạn là/home/dragonx/codefiles, làm

docker run -v /home/dragonx/codefiles:/opt/codefiles mycontainer 

Sau đó, khi bạn chỉnh sửa các tập tin, hoặc từ máy chủ hoặc trong container, họ có sẵn trong container nhưng bạn không cần phải sao chép chúng ra trước khi giết chết docker.

-1

Dưới đây là cách đơn giản nhất để "xây dựng một vài container Docker":

docker run -it --name=my_cont1 --hostname=my_host1 ubuntu:15.10 
docker run -it --name=my_cont2 --hostname=my_host2 ubuntu:15.10 
... 
... 

docker run -it --name=my_contn --hostname=my_hostn ubuntu:15.10 

Điều đó sẽ tạo ra 'n' số container.

Sau lệnh "docker run ..." đầu tiên, bạn sẽ được đưa vào một shell Bash. Bạn có thể làm những việc của bạn ở đó, thoát ra và chạy lệnh "docker run ..." tiếp theo.

Thoát khỏi vỏ Bash không loại bỏ các vùng chứa.Họ vẫn còn ở trạng thái "Đã thoát". Bạn có thể liệt kê chúng với lệnh docker ps -a. Và bạn luôn có thể lấy lại cho họ bằng cách:

docker start -ia my_cont1 
+1

Tôi nghĩ rằng bạn hiểu sai câu hỏi của tôi. Tôi biết cách bắt đầu/dừng container. Tôi đang nói về quá trình chỉnh sửa Dockerfile, dọn dẹp các phiên bản cũ của vùng chứa, xây dựng lại và khởi chạy lại. – dragonx

+0

Bạn nói đúng, tôi đã làm. – Joe

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