Giải pháp DOCKER:
Có vẻ như docker-compose 1.5+ đã cho phép thay thế các biến: https://github.com/docker/compose/release
Docker Compose mới nhất cho phép bạn truy cập các biến môi trường từ tệp soạn thảo của bạn. Vì vậy, bạn có thể nguồn các biến môi trường của mình, sau đó chạy Compose như vậy:
set -a
source .my-env
docker-compose up -d
Sau đó, bạn có thể tham chiếu các biến trong docker-compose.yml bằng cách sử dụng $ {VARIABLE}, như vậy:
db:
image: "postgres:${POSTGRES_VERSION}"
Và đây là thông tin thêm từ các tài liệu, được lấy tại đây: https://docs.docker.com/compose/compose-file/#variable-substlation
Khi bạn chạy docker-compose với cấu hình này, Compose tìm biến môi trường POSTGRES_VERSION trong shell và thay thế giá trị của nó trong. Ví dụ này, Compose phân giải hình ảnh thành postgres: 9.3 trước khi chạy cấu hình.
Nếu một biến môi trường không được đặt, Soạn các thay thế bằng một chuỗi rỗng. Trong ví dụ trên, nếu POSTGRES_VERSION không được đặt, giá trị cho tùy chọn hình ảnh là postgres :.
Cả cú pháp $ VARIABLE và $ {VARIABLE} đều được hỗ trợ. Các tính năng kiểu vỏ mở rộng, như $ {VARIABLE-default} và $ {VARIABLE / foo / bar}, không được hỗ trợ.
Nếu bạn cần đặt ký hiệu đô la bằng chữ trong giá trị cấu hình, hãy sử dụng ký hiệu đô la kép ($$).
Và tôi tin rằng tính năng này đã được thêm vào trong yêu cầu kéo này: https://github.com/docker/compose/pull/1765
Giải pháp BASH:
Tôi nhận thấy mọi người có vấn đề với hỗ trợ biến môi trường của Docker. Thay vì xử lý các biến môi trường trong Docker, hãy quay lại những điều cơ bản, như bash! Đây là một phương pháp linh hoạt hơn bằng cách sử dụng tập lệnh bash và .env
tập tin.
Một ví dụ tập tin .env:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
sau đó chạy tập lệnh bash này trong cùng thư mục, cần triển khai mọi thứ đúng cách:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Chỉ cần tham chiếu các biến env của bạn trong tệp soạn thảo của bạn với cú pháp bash thông thường (nghĩa là ${SECRET_KEY}
chèn tệp SECRET_KEY
từ .env
tệp).
Lưu ý COMPOSE_CONFIG
được xác định trong .env
tệp của tôi và được sử dụng trong tập lệnh bash của tôi, nhưng bạn có thể dễ dàng chỉ cần thay thế {$COMPOSE_CONFIG}
bằng my-compose-file.yml
tập lệnh bash.
Cũng lưu ý rằng tôi đã gắn nhãn triển khai này bằng cách đặt tên cho tất cả các vùng chứa của tôi với tiền tố "myproject". Bạn có thể sử dụng bất kỳ tên nào bạn muốn, nhưng nó giúp xác định các thùng chứa của bạn để bạn có thể dễ dàng tham khảo chúng sau này. Giả sử rằng các thùng chứa của bạn không trạng thái, như vậy, tập lệnh này sẽ nhanh chóng loại bỏ và triển khai lại các thùng chứa của bạn theo thông số tệp .env và tệp YAML soạn thảo của bạn.
Cập nhật
Vì câu trả lời này có vẻ khá phổ biến, tôi đã viết một bài đăng blog mô tả quy trình triển khai Docker của tôi sâu hơn: http://lukeswart.net/2016/03/lets-deploy-part-1/ Điều này có thể hữu ích khi bạn thêm phức tạp hơn đối với cấu hình triển khai, như cấu hình nginx, cerets LetsEncrypt và các thùng chứa được liên kết.