2016-06-20 20 views
5

Tôi đang cố gắng tải tệp docker-compose làm việc với nhiều tệp .env và tôi không có bất kỳ may mắn nào. Tôi đang cố gắng để thiết lập ba .env file: thiết lậpdocker-compose.yml với nhiều env_files

  • toàn cầu đều giống nhau trên tất cả các trường hợp chứa
  • thiết lập môi trường cụ thể (những thứ chỉ dành riêng cho thử nghiệm hoặc dev)
  • thiết lập địa phương - những thứ mà overridable một nhà phát triển có thể cần phải thay đổi trong trường hợp họ có mâu thuẫn với, nói rằng, một số cổng

tập tin docker-compose.yml của tôi trông như thế này:

version: '2' 
services: 
    db: 
    env_file: 
     - ./.env 
     - ./.env.${ENV} 
     - ./.env.local 
    image: postgres 
    ports: 
     - ${POSTGRES_PORT}:5432 

.env trông như thế này:

POSTGRES_USER=myapp 

.env.development trông như thế này:

POSTGRES_PASSWORD=supersecretpassword 
POSTGRES_HOST=localhost 
POSTGRES_PORT=25432 
POSTGRES_DB=myapp_development 

.env.local không tồn tại trong trường hợp này.

Sau khi chạy ENV=development docker-compose up, tôi nhận được kết quả như sau:

$ ENV=development docker-compose up 
WARNING: The POSTGRES_PASSWORD variable is not set. Defaulting to a blank string. 
WARNING: The POSTGRES_DB variable is not set. Defaulting to a blank string. 
WARNING: The POSTGRES_PORT variable is not set. Defaulting to a blank string. 
ERROR: The Compose file './docker-compose.yml' is invalid because: 
services.db.ports is invalid: Invalid port ":5432", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol] 

Từ đó thông báo lỗi, có vẻ như không ai trong số các biến môi trường của tôi đang được sử dụng. Tôi vừa nâng cấp lên bản docker-compose mới nhất cũng như - cùng một lỗi:

$ docker-compose --version 
docker-compose version 1.8.0-rc1, build 9bf6bc6 

Mọi ý tưởng ở đây? Sẽ là tốt đẹp khi có một đơn docker-compose.yml sẽ hoạt động trên nhiều môi trường.

+0

Tô cao su ở đây - Tôi nghĩ rằng vấn đề gốc là tôi đang mong đợi các biến môi trường được khai báo trong tệp .env của tôi để có sẵn trong docker-compose.yml của tôi. Họ không (hoặc, ít nhất, tôi không tin họ là). Tôi có thể loại bỏ toàn bộ phần 'môi trường' khỏi docker-compose.yml của tôi, nhưng tôi không chắc chắn làm thế nào tôi sẽ xử lý chuyển hướng cổng vào lúc này. – matt

+0

Bạn có tìm thấy giải pháp cho điều này không? Các tài liệu docker-compose dường như ngụ ý rằng điều này được cho phép nhưng tôi đang gặp phải cùng một vấn đề. Tôi đoán tôi không hiểu làm thế nào để làm điều này. –

+0

Tôi đã không nhận được nó làm việc, nhưng tôi cũng hiểu tại sao nó không hoạt động - đầu tiên, tôi không cần phần 'môi trường' ở tất cả, vì các tập tin' .env' khác nhau chăm sóc đó. Thứ hai, tệp 'docker-compose.yml' sẽ không đọc trong cài đặt' env_file' - các thiết lập trong đó chỉ được chuyển đến các thùng chứa. Trong lần chạy của tôi, 'POSTGRES_PORT' không tồn tại bởi vì nó không được định nghĩa trong trình bao của tôi, bất kể thực tế là nó nằm trong tệp' .env' của tôi. – matt

Trả lời

0

khi đọc trang này: https://docs.docker.com/compose/environment-variables/

và từ sự hiểu biết của tôi, bạn nên làm như sau:

cho các biến toàn cầu (mà không nên thay đổi) làm cho một tập tin env như vậy:

VAR1=VALUE1 
VAR2=VALUE2 

và cho những người khác (có thể thay đổi), bạn nên thêm tên của họ trong môi trường trong docker-compose.yml như sau:

environment: 
    - VAR1 
    - VAR2 

điều này sẽ lấy giá trị VAR1 và VAR2 từ trình bao mà bạn đang chạy docker-compose.

Tôi hy vọng điều này sẽ hữu ích.

+0

Cảm ơn, nhưng tôi không chắc chắn rằng đây là những gì tôi đang tìm kiếm - vấn đề tôi gặp phải là tôi có 'POSTGRES_PORT' được định nghĩa trong một tệp' .env.test', nhưng tôi muốn nó được sử dụng trong tệp 'docker-compose.yml' của tôi khi tôi bắt đầu vùng chứa - đó là điều không thể, tốt nhất là tôi có thể nói. – matt

+0

không, điều đó không thể thực hiện được. nhưng bạn có thể dịch tập tin env đó thành một '/ etc/profile.d/postgres.sh' trên máy chủ của bạn và thêm các biến đó vào phần môi trường trong docker-compose.yml. sẽ không mất chức năng. và "nỗ lực" để sửa đổi các biến này sẽ giống nhau. –

0

Hãy nhớ rằng có 2 môi trường khác nhau mà bạn đang xác định các biến. Máy chủ nơi bạn đang thực thi lệnh docker-compose và chính vùng chứa (chạy dịch vụ db trong trường hợp của bạn).

Tệp docker-compose.yml của bạn có quyền truy cập vào các biến môi trường của máy chủ lưu trữ của bạn. Do đó, ENV có thể truy cập từ lệnh docker-compose, nhưng không thể truy cập vào các tệp .env của bạn.

Ngược lại, giá trị cho ENV không thể truy cập được bên trong vùng chứa, nhưng tất cả các biến được xác định trong các tệp .env của bạn sẽ.

Tôi không biết liệu bạn có thực sự cần vùng chứa db của mình để truy cập các biến được xác định trên .env.development hay không. Nhưng ít nhất dường như máy chủ của bạn cần có nội dung của tệp đó, vì vậy khi lệnh docker-compose được gọi, biến số POSTGRES_PORT được xác định.

Để khắc phục sự cố cụ thể của bạn, bạn cũng cần xác định các biến môi trường trên máy chủ của mình, không chỉ cho vùng chứa. Bạn có thể làm điều gì đó như sau:

#Set for host 
ENV=development 

#Also sets the variables on the host 
source ./.env.$ENV 

#POSTGRES_PORT defined in .env.development is used here 
docker-compose up 

#since env_file also contains .env.development, the variables will be reachable from the container. 

Hy vọng điều đó sẽ hữu ích.