***บทความนี้ควรมีพื้นฐานเกี่ยวกับการใช้งาน docker-compose มาก่อน สามารถเข้าไปอ่านได้ที่ docker-compose
สำหรับ environment variables นั้นเราจะใช้สำหรับกำหนดค่าของ ตัวแปรต่างๆที่จำเป็นสำหรับใช้ใน application ของเรา เช่น ถ้าเป็น database ก็จะเป็นค่า config ต่างๆ อาธิเช่น hostname, username, password, dbname, ฯลฯ เป็นต้น หรือหากเป็น web application ก็จะเป็นค่า config อาธิ api_url, key ,token, ฯลฯ นั้นเอง ซึ่งถ้าเรากำหนดค่าเหล่านั้นลงในโค้ดเลย ก็คงจะลำบาก หากมีการเปลี่ยนแปลงค่าภายหลัง ซึ่งการกำหนดตัวแปร environment ทำให้ง่ายต่อการจัดการ (management) มากยิ่งขึ้น และยังมีความสำคัญเกี่ยวกับเรื่องความปลอดภัย (security) ด้วย เนื่องจากการที่เรามีการกำหนดค่าลงไปในโค้ด หากเรามีการแชร์โค้ดให้ผู้อื่นหรือ publish ก็อาจจะทำให้ผู้อื่นเห็นค่า config ต่างๆของเราได้นั้นเอง @_@
Docker Compose คือ tool อีกตัวนึงของ docker ที่จะมาช่วยจัดการการสร้าง container หลายๆตัว ให้เป็นเรื่องที่ง่ายขึ้น และใช้งานผ่านไฟล์ docker-compose.yml
docker-compose.yml คือ ไฟล์เอกสารไฟล์หนึ่ง ที่ใช้ในการกำหนดคุณสมบัติต่างๆ ของ container แต่ละตัว เพื่อให้ container เหล่านั้นทำงานขึ้นพร้อมกัน
***ต่อไปนี้จะใช้คำว่า Compose file นั้นหมายถึงไฟล์ docker-compose.yml
การกำหนดค่า Environment variables ใน Compose นั้นสามารถทำได้หลายแบบด้วยกัน เรามาดูกันว่ามีแบบไหนบ้าง
- Substitute environment variables in Compose files
- Set environment variables in containers
- Pass environment variables to containers
- The “env_file” configuration option
- Set environment variables with ‘docker-compose run’
- The “.env” file
1. Substitute environment variables in Compose files
แทนค่าตัวแปร environment ใน compose file
web:
image: "webapp:${TAG}"
สามารถดูรายละเอียดเพิ่มเติม Variable substitute
2. Set environment variables in containers
เซ็ตค่าตัวแปร environment ให้กับ container โดยตรง
เช่นเดียวกับคำสั่ง docker run -e VARIABLE=VALUE …
web:
environment:
- DEBUG=1
สามารถดูรายละเอียดเพิ่มเติม Variable substitute
3. Pass environment variables to containers
ส่งผ่านค่าตัวแปร environment จาก shell ไปยัง container ด้วย environment key โดยไม่ได้ให้ค่ากับตัวแปรเหล่านั้น
เช่นเดียวกับคำสั่ง docker run -e VARIABLE …
web:
environment:
- DEBUG
ค่าของตัวแปร DEBUG ใน compose file จะได้จากตัวแปรเดียวกันใน shell ตอน compose run
Shell คือตัวแปลงคำสั่งที่ช่วยให้ผู้ใช้งานสามารถเข้าถึงระบบ operating system มีด้วยกัน 2 แบบคือ
1. CLI — Command line interface รับคำสั่งโดยข้อมูล text และแสดงผลในรูปแบบ text เช่นกัน
2. GUI — Graphical user interface รับคำสั่งโดยอาศัย mouse และ รูปบนจอ monitor
4. The “env_file” configuration option
สามารถส่งผ่านค่าตัวแปร environment หลายตัวแปร จากไฟล์ภายนอกไปยัง container ด้วยการระบุ option ‘env_file’
เช่นเดียวกับคำสั่ง docker run — env-file=FILE …
web:
env_file:
- web-variables.env
5. Set environment variables with ‘docker-compose run’
สามารถเซ็ตค่าตัวแปร environment ให้กับ container ที่ทำงานครั้งเดียว ด้วยคำสั่ง ‘docker-compose run -e’
เช่นเดียวกับคำสั่ง docker run -e
docker-compose run -e DEBUG=1 web python console.py
คุณยังสามารถที่จะส่งผ่านค่าตัวแปร environment จาก shell โดยไม่ได้ให้ค่ากับมัน
docker-compose run -e DEBUG web python console.py
6. The “.env” file
สามารถเซ็ตค่าเริ่มต้นให้กับตัวแปร environments ใดๆที่ได้อ้างอิงใน compose file โดยกำหนดไว้ใน environment file ชื่อ .env
$ cat .env
TAG=v1.5
$ cat docker-compose.yml
version: '3'
services:
web:
image: "webapp:${TAG}"
เมื่อคุณรันคำสั่ง docker-compose up จากนั้น web service จะกำหนดค่าให้กับตัวแปร TAG จากค่าในไฟล์ .env ซึ่งได้เป็น webapp:v1.5 นั้นเอง และยังสามารถตรวจสอบการกำหนดค่าใน compose file ได้
โดยรันคำสั่ง docker-compose config เพื่อ print มาดูใน terminal
$ docker-compose config
version: '3'
services:
web:
image: 'webapp:v1.5'
ค่าของตัวแปร environment ใน shell จะมี priority ที่สูงกว่าในไฟล์ .env ถ้าคุณมีการกำหนดค่าไว้ทั้งสองที่และมีค่าที่ต่างกัน compose จะเลือกใช้ค่าจาก shell
$ export TAG=v2.0
$ docker-compose config
version: '3'
services:
web:
image: 'webapp:v2.0'
เมื่อคุณมีการกำหนดค่าของตัวแปร environment ที่เหมือนกันในหลายแหล่ง priority ที่ compose จะเลือกใช้เรียงตามดังนี้ (มากไปน้อย)
- Compose file
- Shell environment variables
- Environment file
- Dockerfile
- Variable is not defined
ในตัวอย่างด้านล่าง เราได้มีการกำหนดค่าของตัวแปร environment ที่ชื่อเหมือนกัน ไว้ใน environment file และ compose file
$ cat ./Docker/api/api.env
NODE_ENV=test
$ cat docker-compose.yml
version: '3'
services:
api:
image: 'node:6-alpine'
env_file:
- ./Docker/api/api.env
environment:
- NODE_ENV=production
เมื่อคุณ run container ขึ้นมาค่าของตัวแปร environment จะถูกใช้จาก compose file
$ docker-compose exec api node
> process.env.NODE_ENV
'production'
***เพิ่มเติม สำหรับ NodeJS container ถ้าคุณมี package.json ที่มีการกำหนด script:start เป็น NODE_ENV=test node server.js ซึ่งจะเป็นการ overrule การกำหนดค่าใดๆในไฟล์ docker-compose.yml
สำหรับบทความนี้ก็เป็นเพียงการแนะนำเกี่ยวกับ Environment Variable ใน Compose เท่านั้น ซึ่งรายละเอียดส่วนอื่นของ docker compose ยังมีอีกเยอะมากครับ สำหรับใครที่ต้องการเรียนรู้เพิ่มเติม สามารถเข้าไปอ่านได้ที่ Docker Compose
Reference:
(ข้อมูลอาจมีข้อผิดพลาด ถ้าจะเอาบทความนี้ไปอ้างอิงที่อื่นให้ตรวจสอบให้ดีก่อนนะครับ ขอบคุณครับ)
สำหรับวันนี้ ต้องขอลาไปก่อน สวัสดีครับ NottDev :)