มีคนไปถามในกลุ่ม Docker in Thai เรื่องการทำ Nginx config template โดยใช้ envsubst
คำถามน่าสนใจ
คำถามคือ
รบกวนสอบถามหน่อยครับ ผมใช้ docker-compose ทำการติดตั้ง nginx ต้องการ copy ไฟล์ site.conf ขึ้นไปและ envsubst ทำการเปลี่ยน environment ในไฟล์ site.conf แต่พอทำการ build แล้วไฟล์ site.conf เป็น 0 ไม่มีข้อมูลข้างในเลย ไม่รู้ว่าใช้คำสั่งถูกไหม ขอคำแนะนำหน่อยครับ
มีแนบภาพมาในคำถามด้วย
พร้อม docker-c0mpose ด้วย ดีมาก
มีพี่ปุ๋ยไปตอบคนแรกด้วย มีสาระ
อาจารย์เชษฐ์ของผม ก็ไปร่วมแจม
ผมก็เลยอยากร่วมแจมบ้าง
ไงละๆ กด 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 ขึ้น เลยมาเขียนบล็อกแทน