Environments¶
- Environment variables
- The .env file
Environment variables¶
-
Khi tạo một
servicebất kì, thì việc sử dụng cácenvironment variableslà cần thiết, giúp cho các service khởi tạo và chạy trênenvironmentnào sẽ sử dụng đúngenvironment variablesđó. -
Chẳng hạn như config database connection với các thông tin như database name, user, hay thiết lập môi trường làm việc của service đó là
dev,testhayprod, hoặc các config khác như port, base url... thì việc dùng cácenvironment variablesđể chỉ định trong các config service sẽ sử dụng variables nào. -
Trong Docker,
environment variablescũng cần được set khi chạy service trong docker container. Để định nghĩaenvironment variables:
-e : option để định nghĩa environment variables
các options khác xem decs tại reference/run
- Đối với cách làm này, lợi ích là giúp cho việc bảo mật các
variablesquan trọng thông qua việc chỉ khai báo nó bằng command. Nhưng command dài, Docker cung cấp các option để chúng ta dễ dàng định nghĩa cácvariablecần thiết. Đó làargvàenvironment(với dockerfile thì là ARG và ENV).

- Tuy nhiên thì có sự khác nhau rất lớn giữa
argvàenvironmentđó chính làscopecủa chúng.argđịnh nghĩa các biến dùng khi build image, trong khi đóenvironmentdùng cho lúc khởi chạy container. Thông thường ta sử dụngARGtrongdockerfileđể chỉ định local, test, prod... vàenvironmenttrongdocker-compose.
Using Environment variables in Docker-Compose¶

Sử dụng environment trong docker-compose, lợi ích lớn nhất là dễ dàng quản lý các environment variables. Định nghĩa environment variables bằng Docker-Compose như sau:
version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
environment:
- MONGO_INITDB_DATABASE=MyDatabase
- MONGODB_USER=Nya
- MONGODB_PASS=secretpassword
ports:
- 27020:27017
Ở đây MONGODB_PASS được đặt là secretpassword nhưng nó chưa thực sự secret, khá là risk. Docker cho phép chúng ta không cần chỉ định value cho các environment variables. Điều này rất hữu ích cho việc bảo mật những thông tin quan trọng. Với những gì không cần thiết, chúng ta cứ set value còn những gì quan trọng, chúng ta sẽ giấu đi:
Với việc setting như thế này, nếu ai có được docker compose file cũng không thể connect tới DB vì thiếu thông tin user và password. Lúc này compose sẽ lấy value của các key MONGODB_USER và MONGODB_PASS từ command line:
- Với cách làm này, biến
MONGODB_USERvàMONGODB_PASSđều phải trùng tên với host variables trên command, nếu không Docker sẽ ko lấy được value của nó. Ngoài ra, Docker cung cấp một syntax đễ dễ dàng chỉ định variables trong compose file hơn, nhìn chuyên nghiệp hơn. Đó là${VARIABLE_NAME}. Lúc này config của Docker-Compose như sau:
Với cách config này, ta có thể chỉ định bất cứ host variable nào mà không cần phải sử dụng biến cùng tên nữa. Từ đó tăng tính linh động cho một số config, chẳng hạn như image version.
The .env file¶
-
Việc sử dụng environment option cũng có các downside, điển hình là config dài dòng, nếu có nhiều Docker-compose file, mình đổi
variables1 phát là phải lôi Docker-compose file hết ra để edit. -
Docker cung cấp cho chúng ta một cách setting dễ dàng hơn là sử dụng
.envfile để thay thế cho host variable. Docker compose mặc định sẽ tự động tìm kiếm các key-value pair trong file.envở cùng thư mục với compose file. Ví dụ về.envfile:
-
Các biến này sẽ được sử dụng trong Docker-Compose file thông qua syntax
${VARIABLE}như đã đề cập ở trên -
Syntax khi tạo các variables trong
.envfile:-
Mỗi variable sẽ tương ứng với 1 dòng và phải theo format
KEY=value.KEYkhông bắt buộc phải là uppercase, nên ghi uppercase cho trường hợp biến đó là một constant. -
Sẽ không có space nào giữa
=vàvalue. Nếu có thì dấu space sẽ là một phần của value. Tương tự sẽ không có xử lý đặc biệt nào choquote mark - 'haydouble quotes - ". Nó cũng sẽ được tính là một phần của value luôn. -
Nếu muốn thêm comment thì tạo dòng mới bắt đầu bằng dấu #. Dòng trống sẽ tự động bỏ qua.
-
-
Theo mặc định, Docker-Compose sẽ chỉ đọc thông tin từ file
.envở cùng thư mục với compose file. Trong trường hợ ta có nhiều fileenvironmentnhư.env.ci,.env.dev,.env.prodhaydb.env,microservices.envthì không thể dùng chung một.envfile cho nhiều môi trường được. Docker cung cấp option làenv_fileđể chỉ định cácfile environmentcần sử dụng dùng nó ở command như sau: