รับตัวแปรสภาพแวดล้อมจาก Docker Container


127

วิธีที่ง่ายที่สุดในการรับตัวแปรสภาพแวดล้อมจากคอนเทนเนอร์นักเทียบท่าที่ยังไม่ได้ประกาศใน Dockerfileคืออะไร

ตัวอย่างเช่นตัวแปรสภาพแวดล้อมที่ถูกตั้งค่าผ่านบางdocker exec container /bin/bashเซสชัน?

ฉันทำได้docker exec container env | grep ENV_VARแต่ฉันต้องการสิ่งที่คืนค่ามากกว่า

ฉันได้ลองใช้docker exec container echo "$ENV_VAR"แล้ว แต่การแทนที่ดูเหมือนจะเกิดขึ้นนอกคอนเทนเนอร์ดังนั้นฉันจึงไม่ได้รับ env var จากคอนเทนเนอร์ แต่เป็นการแทนที่ env var จากคอมพิวเตอร์ของฉันเอง

ขอบคุณ


มีเหตุผลอะไรที่ไม่อยากใช้ env และ grep?
aisbaa

ฉันแค่ต้องการค่า ถ้าฉันเข้าใจถูกต้องฉันต้องแยกวิเคราะห์ผลลัพธ์ของการเรียก grep และฉันควรหลีกเลี่ยงสิ่งนั้น
Citronen

ฉันคิดว่าตัวแปรที่ตั้งค่าในเซสชัน exec ไม่มีผลต่อกระบวนการหลักหรือเซสชัน exec ที่ตามมา?
Paul Becotte

คำตอบ:


140

วิธีที่เหมาะสมในการทำงานecho "$ENV_VAR"ภายในคอนเทนเนอร์เพื่อให้การทดแทนตัวแปรเกิดขึ้นในคอนเทนเนอร์คือ:

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

4
โปรดสังเกตว่าคำตอบทั้งหมดนี้ขึ้นอยู่กับเปลือกบางส่วน ฉันไม่สามารถรับตัวแปร env ด้วยไฟล์ปฏิบัติการและอิมเมจฐานรอยขีดข่วน
Richard

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

ฉันได้รับข้อผิดพลาด "Error: No such container: container" ฉันกำลังดำเนินการคำสั่งหลังจากเข้าสู่ระบบผ่าน SSH
kunwar nitesh

1
@kunwarnitesh: คุณต้องแทนที่ "container" ด้วยชื่อของคอนเทนเนอร์ที่คุณต้องการใช้งาน
jwodder

1
ทำให้containerคำดังกล่าวที่ผู้คนเข้าใจว่ามันเป็นตัวแปร
อันวาร์

118

หากต้องการดูตัวแปร env ทั้งหมด:

docker exec container env

เพื่อรับหนึ่ง:

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

คำถามของฉันบอกว่าฉันไม่ต้องการไปเส้นทางนั้น นอกจากนี้ยังติดตามคำถาม: docker exec container envและdocker exec -it container /bin/bashแล้วenvคายสิ่งที่แตกต่าง ทำไม?
Citronen

อา ... อาจเป็นวิธีเฉพาะที่ฉันกำลังสร้างภาพนักเทียบท่าที่ทำให้เป็นเช่นนี้ ...
Citronen

2
หืมตอนนี้หนักกว่ามาก ลองdocker inspect container.
aisbaa

docker inspect containerดูเหมือนจะมีข้อ จำกัด เหมือนกัน ถ้าฉันสร้างตัวแปรสภาพแวดล้อมหลังจากที่ฉันเรียกใช้คอนเทนเนอร์มันจะไม่ปรากฏในการเรียกใช้docker inspect(ในส่วน env)
Citronen

ฉันเชื่อว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับในปัจจุบัน เรามีภาชนะหลายอย่างที่ยังไม่ได้รับการสนับสนุนด้วยคำสั่งยกตัวอย่างเช่นbash alpine-nodeการใช้จึงexec container bash -c "echo $ENV_VAR"ไม่ได้ผล ใช้exec container envงานสำหรับกรณีของฉัน การใช้exec container printenvยังใช้งานได้
rahmatns

78

คุณสามารถใช้printenv VARIABLEแทน/bin/bash -c 'echo $VARIABLE. มันง่ายกว่ามากและไม่ทำการเปลี่ยนตัว:

docker exec container printenv VARIABLE

7
นี่น่าจะเป็นคำตอบสุดท้าย
Ki Jéy

5
หรือเพียงprintenvเพื่อพิมพ์ตัวแปรทั้งหมด
naXa

ใช้งานได้แม้กระทั่งกับ kubernetes: kubectl exec pod-name printenv MY_VARIABLE
Teebu

58

ข้อเสียของการใช้งานdocker execคือต้องใช้คอนเทนเนอร์ที่กำลังทำงานอยู่ดังนั้นdocker inspect -fอาจเป็นประโยชน์หากคุณไม่แน่ใจว่าคอนเทนเนอร์กำลังทำงานอยู่

ตัวอย่าง # 1. แสดงรายการตัวแปรสภาพแวดล้อมที่คั่นด้วยช่องว่างในคอนเทนเนอร์ที่ระบุ:

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

ผลลัพธ์จะมีลักษณะดังนี้:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

ตัวอย่าง # 2. แสดงผล env var แต่ละรายการในบรรทัดใหม่และgrepรายการที่ต้องการตัวอย่างเช่นการตั้งค่าของ mysql container สามารถเรียกดูได้ดังนี้:

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

จะส่งออก:

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

ตัวอย่าง # 3. ลองแก้ไขตัวอย่างด้านบนเพื่อให้ได้ผลลัพธ์ที่เป็นมิตรกับ bashซึ่งสามารถใช้โดยตรงในสคริปต์ของคุณ:

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

จะส่งออก:

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

หากคุณต้องการเจาะลึกมากขึ้นให้ไปที่เอกสารแพ็คเกจข้อความ / เทมเพลตของ Go พร้อมรายละเอียดทั้งหมดของรูปแบบ


1
นั่นคือคำตอบที่ดีที่สุด ฉันคิดว่าน่าจะเป็นคำตอบสำหรับคำถามแยกต่างหาก (เมื่อตู้คอนเทนเนอร์หยุดทำงาน)
Nickolay Kondratenko

นี่เป็นคำตอบเดียวที่เหมาะกับฉัน docker execมักจะบอกว่าภาชนะของฉันไม่รู้
Good Night Nerd Pride

7

ไม่มีคำตอบใด ๆ ข้างต้นแสดงวิธีแยกตัวแปรออกจากคอนเทนเนอร์ที่ไม่ทำงาน (หากคุณใช้echoวิธีการrunนี้คุณจะไม่ได้รับผลลัพธ์ใด ๆ )

เพียงแค่runมีprintenvเช่นดังนั้น:

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

(สังเกตว่าdocker-composeแทนdockerผลงานด้วย)


ตรงไปตรงมามาก! ฉันตกลงตามแนวทางนี้
opncow

หรือเพียงprintenvเพื่อพิมพ์ตัวแปรทั้งหมด
naXa

2

หากมีโอกาสที่คุณใช้VSCodeและติดตั้งส่วนขยายนักเทียบท่าเพียงแค่right+ clickบนนักเทียบท่าที่คุณต้องการตรวจสอบ (ภายในส่วนขยายนักเทียบท่า ) clickในการตรวจสอบและที่นั่นค้นหาenvคุณจะพบค่าตัวแปร envทั้งหมดของคุณ


0

คำตอบของ @ aisbaa ใช้งานได้หากคุณไม่สนใจเมื่อมีการประกาศตัวแปรสภาพแวดล้อม หากคุณต้องการตัวแปรสภาพแวดล้อมแม้ว่าจะมีการประกาศภายในexec /bin/bashเซสชันให้ใช้สิ่งต่อไปนี้

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

มันไม่สวยมาก แต่ก็ทำให้งานเสร็จ

ในการรับค่าให้ใช้:

echo ${out[1]}

ดูคำตอบของ jwodder
Citronen

0

คำสั่งนี้ตรวจสอบสภาพแวดล้อมของกระบวนการ Docker stack ในโฮสต์:

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

0

เราสามารถแก้ไขentrypointคอนเทนเนอร์ที่ไม่ทำงานด้วยdocker runคำสั่ง

ตัวอย่างแสดงตัวแปรสภาพแวดล้อม PATH:

  1. การใช้bashและecho: คำตอบนี้อ้างว่าechoจะไม่สร้างผลลัพธ์ใด ๆ ซึ่งไม่ถูกต้อง

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. การใช้ printenv

    docker run --rm --entrypoint printenv <container> PATH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.