2014-06-19 33 views
9

Tôi có một ứng dụng mà sử dụng một biến môi trường có tên REDIS_URL. Một điển hình REDIS_URL sẽ là redis://172.17.0.5:6379/0. Tôi muốn để có thể cư REDIS_URL dựa trên liên kết container:Sử dụng các biến môi trường vùng chứa được liên kết trong môi trường ứng dụng?

docker run --name redis -d redis 
docker run --name firehose --link redis:redis -e REDIS_URL="redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0" -d firehose/server 

Nhưng tùy thuộc vào cách tôi thoát khỏi các biến môi trường, họ là một trong hai được đánh giá trong vỏ của tôi tại thời gian chạy Docker và trống (redis://:/0), hoặc được chuyển thành các chuỗi chữ (redis://$REDIS_PORT_6379_TCP_ADDR:$REDIS_PORT_6379_TCP_PORT/0).

Làm thế nào tôi có thể cư biến môi trường REDIS_URL ứng dụng của tôi dựa trên conatiner liên kết?

Trả lời

7

Các biến số $REDIS_PORT_6379_TCP_ADDR$REDIS_PORT_6379_TCP_PORT không được biết tại thời điểm lệnh docker run được thực thi do đó không có cách nào để xây dựng nó từ máy chủ lưu trữ.

Tuy nhiên, có một cách giải quyết. Trong Dockerfile cho hình ảnh firehose/server phải có một CMD hoặc ENTRYPOINT rằng mệnh lệnh gì lệnh được thực thi khi hình ảnh được chạy. Bạn có thể đặt một trình bao bọc xung quanh lệnh đó sẽ tạo biến số REDIS_URL. Một cái gì đó như thế này:

#!/bin/sh 
export REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}/0" 
<run command> 

Sử dụng các kịch bản wrapper như CMD hoặc ENTRYPOINT trong Dockerfile.

+1

Làm cho cảm giác. Tôi đã kết thúc bằng 'xuất REDIS_URL = $ {REDIS_URL: -" redis: // $ REDIS_PORT_6379_TCP_ADDR: $ REDIS_PORT_6379_TCP_PORT/0 "}' để tôi có thể duy trì chức năng của một trong hai. Cảm ơn! –

2

Hãy để tôi rẽ hơi off topic lúc đầu. Nếu bạn muốn chuyển đổi biến env thành biến CLI, bạn có thể tránh tập lệnh trình bao bọc bằng cách đánh giá biến bên trong vùng chứa docker.

docker run image /bin/bash -c '/container-command $INSIDE_DOCKER' 

Bây giờ bạn có thể khiếu nại về việc không thể sử dụng biến shell từ bên ngoài vùng chứa của mình. Kỹ thuật dưới đây hoạt động trong trường hợp đó:

docker run image /bin/bash -c "/container-command $OUTSIDE_DOCKER \$INSIDE_DOCKER" 

Quay lại câu hỏi ban đầu. Nếu bạn không sử dụng lệnh mặc định từ Dockerfile nhưng thay vào đó chỉ định nó, bạn có thể sử dụng cách tiếp cận tương tự.

docker run image /bin/bash -c "export FOO=\${INSIDE_DOCKER}; echo \$FOO" 

Lợi thế tiềm năng này có trong vỏ của bạn được mã hóa cứng vào cổng và tên liên kết. Nên có một cách để viết một trình bao bọc bên ngoài docker kiểm tra các cổng đã được xuất bản (có thể cùng với lệnh mặc định) và đặt các biến tương ứng với lệnh liên kết để bạn không dựa vào bất kỳ thứ gì khó mã hóa.

Các vấn đề liên quan