Nhận biến môi trường từ Docker Container


124

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

Chẳng hạn, một biến môi trường đã được đặt qua một số docker exec container /bin/bashphiên?

Tôi có thể làm docker exec container env | grep ENV_VAR, nhưng tôi thích 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 container, vì vậy tôi không nhận được var env từ container, mà là var env từ máy tính của riêng tôi.

Cảm ơn.


Có một lý do tại sao muốn không sử dụng env và grep?
aisbaa

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 lệnh gọi grep và tôi muốn tránh điều đó.
Citronen 2/12/2015

Tôi đã nghĩ biến được đặt trong một phiên thực hiện không ảnh hưởng đến quá trình chính hoặc các phiên thực hiện tiếp theo?
Paul Becotte

Câu trả lời:


136

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

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

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

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

Tôi đang gặp lỗi "Lỗi: Không có container như vậy: container". Tôi đang thực thi lệnh sau khi đăng nhập thông qua SSH.
kunwar nitesh

1
@kunwarnitesh: Bạn cần thay thế "container" bằng tên của container bạn muốn vận hành.
jwodder

1
Tạo containertừ sao cho mọi người hiểu đó là một biến
Anwar

117

Để 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

Câu hỏi của tôi nói rằng tôi không muốn đi theo con đường đó. Ngoài ra, theo dõi câu hỏi: docker exec container envdocker exec -it container /bin/bashvà sau đó envnhổ ra những điều khác nhau. Tại sao?
Citronen 2/12/2015

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

2
Hừm, khó hơn bây giờ rất nhiều. Hãy thử docker inspect container.
aisbaa

docker inspect containerdường như có cùng giới hạn. Nếu tôi tạo một biến môi trường sau khi tôi chạy container, nó sẽ không xuất hiện trong lệnh gọi đến docker inspect(trong phần env).
Citronen 2/12/2015

Tôi tin rằng đây là câu trả lời tốt hơn câu trả lời hiện đang được chấp nhận. Chúng tôi có một số container không được hỗ trợ với bashlệnh, ví dụ alpine-node. Vì vậy, sử dụng exec container bash -c "echo $ENV_VAR"không làm việc. Sử dụng exec container envcông việc cho trường hợp của tôi. Sử dụng exec container printenvcũng hoạt động.
rahmatns

78

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

docker exec container printenv VARIABLE

7
Đây sẽ là câu trả lời cuối cùng
Ki Jéy 6/12/18

4
hoặc chỉ printenvđể in tất cả các biến.
naXa

Điều này hoạt động ngay cả đối với kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu

58

Nhược điểm của việc sử dụng docker execlà nó yêu cầu một container đang chạy , vì vậy docker inspect -fcó thể hữu ích nếu bạn không chắc chắn một container đang chạy.

Ví dụ 1. Xuất ra một danh sách các biến môi trường được phân tách bằng dấu cách trong vùng chứa được chỉ định:

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

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

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Ví dụ # 2. Xuất ra từng var env trên dòng mới và grepcác mục cần thiết, ví dụ, cài đặt của bộ chứa mysql có thể được truy xuất như sau:

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

sẽ xuất 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 sửa đổi ví dụ trên để có đầu ra thân thiện với bash có thể được sử dụng trực tiếp trong tập lệnh của bạn:

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

sẽ xuất 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 lặn sâu hơn, hãy truy cập tài liệu gói văn bản / mẫu của Go với tất cả các chi tiết của định dạng.


1
đó là câu trả lời tốt nhất Tôi nghĩ nên là câu trả lời cho một câu hỏi riêng biệt (khi container bị hỏng)
Nickolay Kondratenko

Đây là câu trả lời duy nhất làm việc cho tôi. docker execluôn nói container của tôi không biết.
Niềm tự hào về đêm Nerd

7

Không có câu trả lời nào ở trên chỉ cho bạn cách trích xuất một biến từ một thùng chứa không chạy (nếu bạn sử dụng echophương pháp này run, bạn sẽ không nhận được bất kỳ đầu ra nào).

Đơn giản chỉ runvới printenv, như vậy:

docker run --rm <container> printenv <MY_VAR>

(Lưu ý rằng docker-composethay vì dockerhoạt động quá)


rất đơn giản! Tôi giải quyết cho phương pháp này.
opncow

hoặc chỉ printenvđể in tất cả các biến.
naXa


0

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

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

Nó không đẹp lắm, nhưng nó hoàn thành công việc.

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

echo ${out[1]}

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

0

Lệnh này kiểm tra môi trường của quá trình ngăn xếp docker trong máy chủ:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

0

Chúng ta có thể sửa đổi entrypointmột container không chạy bằng docker runlệnh.

Ví dụ hiển thị biến môi trường PATH:

  1. bằng cách sử dụng bashecho: Câu trả lời này tuyên bố rằng echosẽ không tạo ra bất kỳ đầu ra nào, điều này không chính xác.

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. sử dụng printenv

    docker run --rm --entrypoint printenv <container> PATH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.