โซลูชัน DOCKER:
ดูเหมือนว่านักเทียบท่าประกอบด้วย 1.5+ ได้เปิดใช้งานการแทนที่ตัวแปร: https://github.com/docker/compose/releases
Compose Docker ล่าสุดช่วยให้คุณเข้าถึงตัวแปรสภาพแวดล้อมจากไฟล์การเขียนของคุณ ดังนั้นคุณสามารถระบุตัวแปรสภาพแวดล้อมของคุณแล้วเรียกใช้ Compose ดังนี้:
set -a
source .my-env
docker-compose up -d
จากนั้นคุณสามารถอ้างอิงตัวแปรใน docker-compose.yml โดยใช้ $ {VARIABLE} ได้เช่น:
db:
image: "postgres:${POSTGRES_VERSION}"
และนี่คือข้อมูลเพิ่มเติมจากเอกสารนำมาที่นี่: https://docs.docker.com/compose/compose-file/#variable-substitution
เมื่อคุณรัน docker-compose ด้วยการกำหนดค่านี้ Compose จะค้นหาตัวแปรสภาพแวดล้อม POSTGRES_VERSION ในเชลล์และทดแทนค่าในระบบตัวอย่างการเขียนแก้ไขรูปภาพเพื่อ postgres: 9.3 ก่อนรันการกำหนดค่า
หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมให้ทำการแทนที่ด้วยสตริงว่าง ในตัวอย่างด้านบนหากไม่ได้ตั้งค่า POSTGRES_VERSION ค่าสำหรับตัวเลือกรูปภาพจะเป็น postgres:
สนับสนุนทั้งไวยากรณ์ $ VARIABLE และ $ {VARIABLE} ไม่รองรับคุณสมบัติสไตล์เชลล์เช่น $ {VARIABLE-default} และ $ {VARIABLE / foo / bar}
หากคุณต้องการใส่สัญลักษณ์ดอลลาร์ตามตัวอักษรในค่าการกำหนดค่าให้ใช้เครื่องหมายดอลลาร์สอง ($$)
และฉันเชื่อว่าคุณสมบัตินี้ได้รับการเพิ่มเข้ามาในคำขอแบบดึงนี้: https://github.com/docker/compose/pull/1765
วิธีการทุบตี:
ฉันสังเกตเห็นว่าคนมีปัญหากับการสนับสนุนตัวแปรสภาพแวดล้อมของ Docker แทนที่จะจัดการกับตัวแปรสภาพแวดล้อมใน Docker เรากลับไปสู่พื้นฐานเช่นทุบตี! นี่คือวิธีการที่ยืดหยุ่นมากขึ้นโดยใช้ bash script และ.env
ไฟล์
ตัวอย่างไฟล์. env:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
จากนั้นรันสคริปต์ทุบตีนี้ในไดเรกทอรีเดียวกันซึ่งควรปรับใช้ทุกอย่างให้ถูกต้อง:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
เพียงแค่อ้างอิงตัวแปร env ของคุณในไฟล์การเขียนของคุณด้วยไวยากรณ์ bash ตามปกติ (เช่น${SECRET_KEY}
การแทรกSECRET_KEY
จาก.env
ไฟล์)
สังเกตว่าCOMPOSE_CONFIG
มีการกำหนดไว้ใน.env
ไฟล์ของฉันและใช้ในสคริปต์ทุบตีของฉัน แต่คุณสามารถแทนที่{$COMPOSE_CONFIG}
ด้วยmy-compose-file.yml
ในสคริปต์ทุบตีได้อย่างง่ายดาย
โปรดทราบว่าฉันติดป้ายการปรับใช้นี้โดยการตั้งชื่อคอนเทนเนอร์ทั้งหมดด้วยคำนำหน้า "myproject" คุณสามารถใช้ชื่อใดก็ได้ที่คุณต้องการ แต่มันจะช่วยระบุภาชนะของคุณเพื่อให้คุณสามารถอ้างอิงได้อย่างง่ายดายในภายหลัง สมมติว่าคอนเทนเนอร์ของคุณไร้สัญชาติอย่างที่ควรจะเป็นสคริปต์นี้จะทำการลบและปรับใช้คอนเทนเนอร์ของคุณใหม่อย่างรวดเร็วตามพารามิเตอร์. env ของคุณและการเขียนไฟล์ YAML
อัปเดต
เนื่องจากคำตอบนี้ค่อนข้างเป็นที่นิยมฉันเขียนโพสต์บล็อกที่อธิบายขั้นตอนการปรับใช้ Docker ในเชิงลึกยิ่งขึ้น: http://lukeswart.net/2016/03/lets-deploy-part-1/นี่อาจเป็นประโยชน์เมื่อคุณเพิ่ม ความซับซ้อนมากขึ้นในการกำหนดค่าการปรับใช้เช่น nginx configs LetsEncrypt certs และคอนเทนเนอร์ที่เชื่อมโยง