จะกำหนดตัวแปรใน Dockerfile ได้อย่างไร?


155

ในDockerfileของฉันฉันต้องการกำหนดตัวแปรที่ฉันสามารถใช้ใน Dockerfileได้ในภายหลัง

ฉันตระหนักถึงENVคำสั่ง แต่ฉันไม่ต้องการให้ตัวแปรเหล่านี้เป็นตัวแปรสภาพแวดล้อม

มีวิธีการประกาศตัวแปรที่ขอบเขต Dockerfileหรือไม่?


10
คุณสามารถใช้ ARG - ดูdocs.docker.com/engine/reference/builder/#arg
lumos0815

@ lumos0815 ฉันคิดว่าคุณควรโพสต์นั้นเป็นคำตอบของคุณ (แม้ว่ามันจะเป็นโพสต์เก่าสำหรับลูกหลาน) เพราะนั่นคือสิ่งที่ OP ต้องการ
กรีด

ARG ไม่ได้กำหนด var ที่สามารถใช้ภายใน dockerfile คุณจะต้องจับคู่นั้นด้วยคำสั่ง ENV เพื่อให้ได้สิ่งที่คุณต้องการ ARG foo; ENV FOO = $ foo; คัดลอกไฟล์ $ foo (ขออภัยสำหรับการจัดรูปแบบที่ไม่ดีฉันคิดว่ามันเป็นไปไม่ได้ที่จะทำบล็อคโค้ดและหลายบรรทัดจากโทรศัพท์)
ntwrkguru

คำตอบ:


111

คุณสามารถใช้ARG- ดูhttps://docs.docker.com/engine/reference/builder/#arg

ARGคำแนะนำและกำหนดตัวแปรที่ผู้ใช้งานสามารถส่งผ่านที่สร้างเวลาในการสร้างที่มีการdocker buildสั่งใช้ --build-arg <varname>=<value>ธง หากผู้ใช้ระบุอาร์กิวเมนต์สำหรับการสร้างที่ไม่ได้กำหนดไว้ใน Dockerfile บิลด์จะแสดงข้อผิดพลาด


@MargachChris ควรเป็นไปได้ที่จะใช้ตัวแปรสำหรับ COPY
lumos0815

ดูเหมือนจะใช้งานไม่ได้กับคำสั่ง COPY docs.docker.com/engine/reference/builder/#arg
femibyte

54

สำหรับความรู้ของฉันENVอนุญาตเฉพาะสิ่งที่กล่าวถึงใน " การแทนที่สิ่งแวดล้อม "

ตัวแปรสภาพแวดล้อม (ประกาศพร้อมENVคำสั่ง) สามารถใช้ในคำสั่งบางอย่างเนื่องจากตัวแปรที่ตีความโดย Dockerfile

พวกเขาจะต้องเป็นตัวแปรสภาพแวดล้อมเพื่อที่จะประกาศใหม่ในแต่ละคอนเทนเนอร์ใหม่ที่สร้างขึ้นสำหรับแต่ละบรรทัดของ Dockerfile โดย docker buildโดย

กล่าวอีกนัยหนึ่งตัวแปรเหล่านั้นไม่ได้ตีความโดยตรงใน Dockerfile แต่ในคอนเทนเนอร์ที่สร้างขึ้นสำหรับบรรทัด Dockerfile ดังนั้นการใช้ตัวแปรสภาพแวดล้อม


วันนี้ผมใช้ทั้งสองARG( นักเทียบท่า 1.10+ และdocker build --build-arg var=value ) ENVและ
ใช้ARGเพียงอย่างเดียวหมายถึงตัวแปรของคุณจะมองเห็นได้เวลาที่สร้าง, ไม่ที่รันไทม์

โดยปกติแล้ว Dockerfile ของฉันจะมี:

ARG var
ENV var=${var}

ในกรณีของคุณARGก็เพียงพอแล้ว: โดยปกติฉันใช้เพื่อตั้งค่าตัวแปร http_proxy ซึ่งเป็นสิ่งที่นักสร้างพอร์ตต้องการสำหรับการเข้าถึงอินเทอร์เน็ต ณ เวลาบิลด์


51

ในการตอบคำถามของคุณ:

ใน Dockerfile ของฉันฉันต้องการกำหนดตัวแปรที่ฉันสามารถใช้ใน Dockerfile ได้ในภายหลัง

คุณสามารถกำหนดตัวแปรด้วย:

ARG myvalue=3

ไม่อนุญาตให้เว้นวรรคด้วยอักขระที่เท่ากัน

และใช้ในภายหลังด้วย:

RUN echo $myvalue > /test

13

หากตัวแปรนั้นถูกใช้ซ้ำภายในRUNคำสั่งเดียวกันใคร ๆ ก็สามารถตั้งค่าตัวแปรเชลล์ได้ ผมชอบวิธีที่พวกเขาเดินเข้ามาใกล้นี้ด้วยอย่างเป็นทางการทับทิม Dockerfile


คำตอบที่ดี ในขณะที่คุณควรใช้ ARG ถ้าเป็นไปได้บางครั้งคุณต้องกำหนดและใช้ตัวแปรแบบไดนามิกอีกครั้ง ตัวอย่าง:RUN foo=$(date) && echo $foo
wisbucky

3

คุณสามารถใช้และในระหว่างคำสั่งการทำงานคุณยังสามารถปรับปรุงค่านี้โดยใช้ARG variable defaultValue --build-arg variable=valueหากต้องการใช้ตัวแปรเหล่านี้ในไฟล์นักเทียบท่าคุณสามารถอ้างอิงได้ว่า$variableในคำสั่งเรียกใช้

หมายเหตุ:ตัวแปรเหล่านี้จะพร้อมใช้งานสำหรับคำสั่ง Linux เช่นนั้นRUN echo $variableและจะไม่คงอยู่ในอิมเมจ

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