2015-05-17 17 views
5

Tôi có các dòng sau trong Dockerfile nơi tôi muốn đặt giá trị trong tệp cấu hình thành giá trị mặc định trước khi ứng dụng khởi động ở cuối và cung cấp tùy chọn cài đặt bằng tùy chọn -e khi bắt đầu container.Chuyển biến từ vùng chứa sang tập tin

Tôi cố gắng để làm ENV commando này sử dụng Docker của

ENV CONFIG_VALUE default_value 
RUN sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE 
CMD command_to_start_app 

Tôi có chuỗi CONFIG_VALUE một cách rõ ràng trong file CONFIG_FILE và giá trị mặc định từ Dockerfile được thay thế một cách chính xác. Tuy nhiên, khi tôi chạy thùng chứa với -e CONFIG_VALUE=100 việc thay thế không được thực hiện, giá trị mặc định được đặt trong Dockerfile được giữ lại.

Khi tôi làm

docker exec -i -t container_name bash 

echo $CONFIG_VALUE bên trong container biến môi trường có chứa giá trị mong muốn 100.

+0

Cảm ơn, do tỷ lệ của ví dụ của bạn đã giúp tôi 'thoát' biến môi trường cho sed một cách chính xác (bằng cách loại trừ phần bằng ''). – sebkraemer

Trả lời

5

Đó không phải nên có thể trong một Dockerfile: những hướng dẫn này là tĩnh, để làm một tấm ảnh.

Nếu bạn cần hướng dẫn thời gian chạy khi khởi chạy vùng chứa, bạn nên mã hóa chúng trong tập lệnh được gọi là chỉ thị CMD.
Nói cách khác, sed sẽ diễn ra trong tập lệnh được gọi là CMD. Khi thực hiện docker run, tập lệnh đó sẽ có quyền truy cập vào biến môi trường được đặt ngay trước khi nói docker run.

7

Hướng dẫn trong Dockerfile được đánh giá theo từng dòng khi bạn thực hiện docker build và không được đánh giá lại vào thời gian chạy.

Bạn vẫn có thể thực hiện việc này bằng cách sử dụng tập lệnh nhập cảnh, sẽ được đánh giá vào thời gian chạy sau khi đã đặt bất kỳ biến môi trường nào.

Ví dụ, bạn có thể định nghĩa như sau entrypoint.sh kịch bản:

#!/bin/bash 

sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE 
exec "[email protected]" 

Các exec "[email protected]" sẽ thực hiện bất kỳ CMD hoặc lệnh đó được thiết lập.

Thêm nó vào Dockerfile ví dụ:

COPY entrypoint.sh/
RUN chmod +x /entrypoint.sh 
ENTRYPOINT ["/entrypoint.sh"] 

Lưu ý rằng nếu bạn có một entrypoint hiện tại, bạn sẽ cần phải hợp nhất nó với một này - bạn chỉ có thể có một entrypoint.

Bây giờ bạn nên tìm tức là rằng các biến môi trường được tôn trọng:

docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE 

nên làm việc như mong đợi.

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