2015-12-02 32 views
30

Cách đơn giản nhất để lấy biến môi trường từ một container docker mà chưa được khai báo trong Dockerfile là gì?Lấy biến môi trường từ Docker Container

Ví dụ: biến môi trường đã được đặt qua một số phiên docker exec container /bin/bash?

Tôi có thể làm docker exec container env | grep ENV_VAR, nhưng tôi muốn cái gì đó chỉ trả về giá trị.

Tôi đã thử sử dụng docker exec container echo "$ENV_VAR", nhưng sự thay thế dường như xảy ra bên ngoài vùng chứa, vì vậy tôi không lấy được env var từ vùng chứa, mà là env var từ máy tính của riêng tôi.

Cảm ơn.

+0

Có lý do nào không muốn sử dụng env và grep không? – aisbaa

+0

Tôi chỉ cần giá trị. Nếu tôi hiểu chính xác, tôi cần phân tích đầu ra của cuộc gọi grep, và tôi muốn tránh điều đó. – Citronen

+0

Tôi đã nghĩ biến đã được thiết lập trong một phiên exec không ảnh hưởng đến quá trình chính hoặc phiên exec tiếp theo? –

Trả lời

54

Cách thích hợp để chạy echo "$ENV_VAR" bên trong chứa để biến thay thế xảy ra trong container là:

docker exec container bash -c 'echo "$ENV_VAR"' 
+0

THÔNG BÁO rằng tất cả các câu trả lời đều phụ thuộc vào một số trình bao. Tôi không thể nhận được các biến env với một thực thi và một hình ảnh cơ sở đầu. – Richard

+0

'docker run --rm -it CONTAINER bash -c 'echo" $ MY_ENV_VAR "'' – Henrik

23

Để xem tất cả các biến env:

docker exec container env 

Để có được một:

docker exec container env | grep VARIABLE | cut -d'=' -f2 
+0

Câu hỏi của tôi nói rằng tôi không muốn đi tuyến đường đó. Ngoài ra, câu hỏi tiếp theo: 'docker exec container env' và' docker exec -it container/bin/bash' và sau đó 'env' nhổ ra những thứ khác nhau. Tại sao? – Citronen

+0

Ah ... có thể là cách cụ thể tôi đang xây dựng hình ảnh docker mà làm cho trường hợp này ... – Citronen

+0

Hm, rất nhiều khó khăn hơn bây giờ. Hãy thử 'docker inspection container'. – aisbaa

0

@ câu trả lời aisbaa của hoạt động nếu bạn không quan tâm khi các biến môi trường đã được công bố. Nếu bạn muốn biến môi trường, ngay cả khi nó đã được công bố bên trong một phiên exec /bin/bash, sử dụng một cái gì đó như:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1) 

Đó là không phải là rất đẹp, nhưng nó được công việc làm.

Để sau đó nhận được giá trị, sử dụng:

echo ${out[1]} 
+0

Xem câu trả lời của jwodder. – Citronen

26

Bạn có thể sử dụng printenv VARIABLE thay vì /bin/bash -c 'echo $VARIABLE. Đó là đơn giản hơn nhiều và nó không thực hiện thay:

docker exec container printenv VARIABLE 
12

Nhược điểm của việc sử dụng docker exec là nó đòi hỏi một chạy container, nên docker inspect -f có thể thuận tiện nếu bạn không chắc chắn một container đang chạy.

Ví dụ số 1. Output một danh sách các biến môi trường không gian tách ra trong container quy định:

docker inspect -f \ 
    '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name 

đầu ra sẽ trông như thế này:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3 

Ví dụ # 2. Output mỗi env var trên dòng mới và grep các mục cần thiết, ví dụ, cài đặt các thùng chứa mysql của thể được lấy ra như thế này:

docker inspect -f \ 
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \ 
    container_name | grep MYSQL_ 

chí đầu ra:

MYSQL_PASSWORD=secret 
MYSQL_ROOT_PASSWORD=supersecret 
MYSQL_USER=demo 
MYSQL_DATABASE=demodb 
MYSQL_MAJOR=5.5 
MYSQL_VERSION=5.5.52 

Ví dụ # 3. Hãy thay đổi ví dụ trên để có được một bash thân thiện đầu ra có thể được sử dụng trực tiếp trong kịch bản của bạn:

docker inspect -f \ 
    '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \ 
    container_name | grep MYSQL 

chí đầu ra:

export MYSQL_PASSWORD=secret 
export MYSQL_ROOT_PASSWORD=supersecret 
export MYSQL_USER=demo 
export MYSQL_DATABASE=demodb 
export MYSQL_MAJOR=5.5 
export MYSQL_VERSION=5.5.52 

Nếu bạn muốn tìm hiểu sâu hơn, sau đó đi đến Tài liệu gói text/template của Go với tất cả các chi tiết của định dạng.

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