ในDockerfileของฉันฉันต้องการกำหนดตัวแปรที่ฉันสามารถใช้ใน Dockerfileได้ในภายหลัง
ฉันตระหนักถึงENV
คำสั่ง แต่ฉันไม่ต้องการให้ตัวแปรเหล่านี้เป็นตัวแปรสภาพแวดล้อม
มีวิธีการประกาศตัวแปรที่ขอบเขต Dockerfileหรือไม่?
ในDockerfileของฉันฉันต้องการกำหนดตัวแปรที่ฉันสามารถใช้ใน Dockerfileได้ในภายหลัง
ฉันตระหนักถึงENV
คำสั่ง แต่ฉันไม่ต้องการให้ตัวแปรเหล่านี้เป็นตัวแปรสภาพแวดล้อม
มีวิธีการประกาศตัวแปรที่ขอบเขต Dockerfileหรือไม่?
คำตอบ:
คุณสามารถใช้ARG
- ดูhttps://docs.docker.com/engine/reference/builder/#arg
ARG
คำแนะนำและกำหนดตัวแปรที่ผู้ใช้งานสามารถส่งผ่านที่สร้างเวลาในการสร้างที่มีการdocker build
สั่งใช้--build-arg <varname>=<value>
ธง หากผู้ใช้ระบุอาร์กิวเมนต์สำหรับการสร้างที่ไม่ได้กำหนดไว้ใน Dockerfile บิลด์จะแสดงข้อผิดพลาด
สำหรับความรู้ของฉัน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 ซึ่งเป็นสิ่งที่นักสร้างพอร์ตต้องการสำหรับการเข้าถึงอินเทอร์เน็ต ณ เวลาบิลด์
ในการตอบคำถามของคุณ:
ใน Dockerfile ของฉันฉันต้องการกำหนดตัวแปรที่ฉันสามารถใช้ใน Dockerfile ได้ในภายหลัง
คุณสามารถกำหนดตัวแปรด้วย:
ARG myvalue=3
ไม่อนุญาตให้เว้นวรรคด้วยอักขระที่เท่ากัน
และใช้ในภายหลังด้วย:
RUN echo $myvalue > /test
หากตัวแปรนั้นถูกใช้ซ้ำภายในRUN
คำสั่งเดียวกันใคร ๆ ก็สามารถตั้งค่าตัวแปรเชลล์ได้ ผมชอบวิธีที่พวกเขาเดินเข้ามาใกล้นี้ด้วยอย่างเป็นทางการทับทิม Dockerfile
RUN foo=$(date) && echo $foo
คุณสามารถใช้และในระหว่างคำสั่งการทำงานคุณยังสามารถปรับปรุงค่านี้โดยใช้ARG variable defaultValue
--build-arg variable=value
หากต้องการใช้ตัวแปรเหล่านี้ในไฟล์นักเทียบท่าคุณสามารถอ้างอิงได้ว่า$variable
ในคำสั่งเรียกใช้
หมายเหตุ:ตัวแปรเหล่านี้จะพร้อมใช้งานสำหรับคำสั่ง Linux เช่นนั้นRUN echo $variable
และจะไม่คงอยู่ในอิมเมจ