ทำความเข้าใจกับ Environment variables ใน Compose

NottDev
3 min readOct 14, 2019

--

***บทความนี้ควรมีพื้นฐานเกี่ยวกับการใช้งาน 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 นั้นสามารถทำได้หลายแบบด้วยกัน เรามาดูกันว่ามีแบบไหนบ้าง

  1. Substitute environment variables in Compose files
  2. Set environment variables in containers
  3. Pass environment variables to containers
  4. The “env_file” configuration option
  5. Set environment variables with ‘docker-compose run’
  6. 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 จะเลือกใช้เรียงตามดังนี้ (มากไปน้อย)

  1. Compose file
  2. Shell environment variables
  3. Environment file
  4. Dockerfile
  5. 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 :)

--

--

NottDev
NottDev

Written by NottDev

Your only limit is your mind.

No responses yet