2015-01-07 24 views
35

Nếu tôi có vùng chứa docker mà tôi đã bắt đầu một lúc, cách tốt nhất để đặt biến môi trường trong vùng chứa đang chạy là gì? Tôi thiết lập một biến môi trường ban đầu khi tôi chạy lệnh chạy.Cách đặt biến môi trường trong vùng chứa docker đang hoạt động

$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress 

nhưng bây giờ nó đã chạy được một thời gian, tôi muốn thêm một số khác VIRTUAL_HOST vào biến môi trường. Tôi không muốn xóa các container và sau đó chỉ cần chạy lại nó với biến môi trường mà tôi muốn bởi vì sau đó tôi sẽ phải di chuyển các tập cũ sang container mới, nó có các tập tin chủ đề và tải lên trong đó mà tôi không muốn thua.

Tôi chỉ muốn thay đổi giá trị của biến môi trường VIRTUAL_HOST.

+0

Nó không thể thay đổi các biến môi trường của một tiến trình đang chạy ngoại trừ trong chính quá trình đó. Điều này có thể được thực hiện bằng cách cho phép cập nhật cấu hình biến môi trường (thông qua 'cập nhật docker) và sau đó khởi động lại vùng chứa. – cpuguy83

Trả lời

10

Docker không cung cấp tính năng này.

Có một vấn đề: "How to set an enviroment variable on an existing container? #8838"

Cũng từ "Allow docker start to take environment variables #7561":

Ngay bây giờ Docker không thể thay đổi cấu hình của container khi nó đã được tạo ra, và nói chung đây là OK vì nó là tầm thường để tạo ra một container mới.

+0

Ahh, điều đó thật tệ. Tôi sẽ tìm ra cách. Nó là tầm thường để tạo ra một container mới, nhưng nó không phải là tầm thường để lấy khối lượng từ một container cũ và gắn chúng vào một container mới. Tôi không muốn mất thư mục wp-content. Nó thực sự không phải là khó để tự di chuyển qua các khối lượng, nhưng tôi đang cố gắng để tự động hóa những thứ để nó loại thất bại mục đích. Có lẽ tôi có thể viết một hàm python thực hiện điều này. https://gist.github.com/anonymous/68f4138261fdb73a6e79 –

+1

Bạn có thể sử dụng vùng chứa chỉ dữ liệu riêng biệt và 'khối lượng-từ' không? – Bryan

22

Có generaly hai lựa chọn, bởi vì Docker không hỗ trợ tính năng này ngay bây giờ:

  1. Tạo kịch bản riêng của bạn, mà sẽ đóng vai trò như Á hậu cho lệnh của bạn. Ví dụ:

    #!/bin/bash 
    export VAR1=VAL1 
    export VAR2=VAL2 
    your_cmd 
    
  2. Chạy lệnh của bạn sau cách:

    docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd" 
    
+0

Bây giờ nó đã được khoảng 2,5 năm, đây vẫn là cách tốt nhất để làm những điều hay docker cho phép một cách tiếp cận trực tiếp hơn? –

4

Đối với một trường hợp sử dụng hơi hẹp, docker issue 8838 đề cập đến loại-of-hack này:

Bạn chỉ cần dừng docker daemon và thay đổi cấu hình container trong /var/lib/docker/containers/[container-id]/config.json (sic)

Giải pháp này cập nhật các biến môi trường mà không cần phải xóa và chạy lại vùng chứa, phải di chuyển khối lượng và ghi nhớ tham số đến run.

Tuy nhiên, điều này yêu cầu khởi động lại trình nền của trình docker. Và, cho đến khi phát hành issue 2658, điều này bao gồm khởi động lại tất cả các vùng chứa.

1

Bạn đã viết rằng bạn không muốn di chuyển khối lượng cũ. Vì vậy, tôi giả sử hoặc là Dockerfile mà bạn đã sử dụng để tạo hình ảnh spencercooley/wordpress có xác định VOLUME s hoặc bạn đã chỉ định chúng trên dòng lệnh bằng công tắc -v.

Bạn chỉ có thể bắt đầu một container mới nhập khẩu khối lượng từ cái cũ bằng --volumes-from switch như:

$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres 

Vì vậy, bạn sẽ có một container tươi nhưng bạn không mất dữ liệu cũ. Bạn thậm chí không cần chạm hoặc di chuyển nó.

Vùng chứa được thực hiện luôn là không trạng thái. Điều đó có nghĩa là quá trình của nó là nghĩa vụ phải thêm hoặc sửa đổi chỉ các tập tin trên khối lượng được xác định. Điều đó có thể được xác minh với một đơn giản docker diff <containerId> sau khi container chạy một thời gian.

Trong trường hợp đó, không nguy hiểm khi bạn tạo lại vùng chứa có cùng thông số (trong trường hợp của bạn có chút biến đổi). Giả sử bạn tạo nó từ chính xác cùng một hình ảnh mà từ đó cái cũ được tạo ra và bạn tái sử dụng cùng một khối lượng với công tắc được đề cập ở trên.

Sau khi vùng chứa mới đã bắt đầu thành công và bạn đã xác minh rằng mọi thứ đều chạy chính xác, bạn có thể xóa vùng chứa wordpress cũ. Khối lượng cũ sau đó được giới thiệu từ vùng chứa mới và sẽ không bị xóa.

1

Trước tiên, bạn có thể đặt env bên trong vùng chứa giống như cách bạn làm trên hộp linux.

Thứ hai, bạn có thể làm điều đó bằng cách sửa đổi tệp cấu hình của vùng chứa docker của bạn (/var/lib/docker/containers/xxxx/config.v2.json). Lưu ý rằng bạn cần khởi động lại dịch vụ docker để có hiệu lực. Bằng cách này bạn có thể thay đổi một số thứ khác như lập bản đồ cảng, vv

1

Để:

  1. thiết lập nhiều env. vars trong một bước,
  2. ngăn chặn phơi bày chúng trong lịch sử 'sh', giống như với tùy chọn '-e' (thông qua thẻ thông tin/api!),

bạn có thể sử dụng

- env-file key_value_file.txt

tùy chọn:

docker run --env-file key_value_file.txt $INSTANCE_ID 
Các vấn đề liên quan