มีคนไปถามในกลุ่ม Docker in Thai เรื่องการทำ Nginx config template โดยใช้ envsubst คำถามน่าสนใจ

คำถามคือ

รบกวนสอบถามหน่อยครับ ผมใช้ docker-compose ทำการติดตั้ง nginx ต้องการ copy ไฟล์ site.conf ขึ้นไปและ envsubst ทำการเปลี่ยน environment ในไฟล์ site.conf แต่พอทำการ build แล้วไฟล์ site.conf เป็น 0 ไม่มีข้อมูลข้างในเลย ไม่รู้ว่าใช้คำสั่งถูกไหม ขอคำแนะนำหน่อยครับ

มีแนบภาพมาในคำถามด้วย

พร้อม docker-c0mpose ด้วย ดีมาก

มีพี่ปุ๋ยไปตอบคนแรกด้วย มีสาระ

อาจารย์เชษฐ์ของผม ก็ไปร่วมแจม

ผมก็เลยอยากร่วมแจมบ้าง

https://www.facebook.com/groups/858633044176588/permalink/3170776116295591/

ไงละๆ กด Care กันเลยทีเดียว

ที่ผมไปคอมเม้นแบบนั้น เพราะว่าผมเก่งมาก

แน่นอน ผมเก่งจริงๆ ไม่เชื่อลองดู

ท่ดๆ พิมพ์ผิด มีแก้ไข

นอกเรื่องมากตั้งไกล ที่จะพูดถึงคือ envsubst แค่นั้นเอง

envsubst คือ คำสั่งในการแทนที่ค่าใน string หรือข้อความ ด้วยการอ่านค่ามาจาก Environment Variable

ตัวอย่าง

$ export NAME=CHANG
$ echo 'hello $NAME' | envsubst
hello CHANG

ในตัวอย่างข้างบนคือเรียกใช้คำสั่ง envsubst ตรงๆเลย อาจจะยังไม่เห็นภาพ เดี๋ยวลองใช้ผ่าน Docker และ Nginx ดู

ก่อนอื่นรัน Nginx ใน Docker มาก่อน โดยทำการ map ไดเรคทอรีเข้าไป 2 ตัว คือ conf.d และ html

$ docker run -d --name nginx \
  -v $PWD/conf.d:/etc/nginx/conf.d \
  -v $PWD/html:/var/www/html \
  -p 80:80 \
  nginx:alpine

จะได้คอนเทนเนอร์ และ 2 ไดเรคทอรี่เปล่าๆคือ conf.d, html

ลองสร้างไฟล์ conf.d/site.tmpl โดยมีค่าตามนี้

server {
    listen $HOST:$PORT;
    server_name $SERVER_NAME;

    root /var/www/html/$SERVER_NAME;

    location / {
    }
}

จากนั้น ลองสร้างไฟล์คอนฟิกใหม่ โดยใช้ conf.d/site.tmpl เป็นต้นแบบ โดยจะตั้งชื่อเซิฟเวอร์ หรือ โดเมนเป็น kop.opop

cat conf.d/site.tmpl | docker exec -i \
  -e HOST=0.0.0.0 \
  -e PORT=80 \
  -e SERVER_NAME=kop.opop \
  nginx sh -c 'envsubst > /etc/nginx/conf.d/$SERVER_NAME.conf'

จากนั้น เราจะได้ไฟล์ชื่อ conf.d/kop.opop.conf โดยมีคอนฟิกตามนี้

server {
    listen 0.0.0.0:80;
    server_name kop.opop;

    root /var/www/html/kop.opop;

    location / {
    }
}

จากนั้น ก็ใช้มายากล สร้างไฟล์ และไดเรคทอรี่ใน html ให้ตรงกับ SERVER_NAME จะได้

จะเห็นว่า เราสามารถอ่านค่า Environment Variable ไปใส่ใน Nginx Config ได้ ด้วย envsubst เพิ่มความยืดหยุ่นในการใช้ Nginx ใน Docker ได้ระดับหนึ่งเลย

สุดท้าย ผมบอกแล้วว่า ผมเก่ง Docker, Nginx มาก

วิดีโอ Live ที่ลืมเอา Terminal ขึ้น เลยมาเขียนบล็อกแทน

Nginx Configurations template with envsubst

Nginx Configurations template with envsubst. // substitutes environment variables in shell format strings อ้าว ลืมแชร์ Terminal

Posted by ทดลองเป็นโปรแกรมเมอร์ - หื่น on Wednesday, 13 May 2020