2014-04-14 30 views
53

Tôi có thể sử dụng biến môi trường trong CMD stanza của tôi trong Dockerfile không?Sử dụng biến môi trường trong CMD

tôi muốn làm một cái gì đó như thế này:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"] 

đâu $ MEMCACHE_11211_TCP_ * sẽ được thiết lập tự động bằng sự bao gồm của tham số --Liên của lệnh docker run tôi. Và $ ARG sẽ được cấu hình bởi người dùng trong thời gian chạy, có thể bởi tham số "-e"?

Điều này dường như không hoạt động đối với tôi, có vẻ như theo nghĩa đen là đi qua chuỗi "$ ARG" chẳng hạn.

Trả lời

5

Tôi không thể nói về cách giả sử hoạt động, nhưng tôi nghĩ nếu bạn gọi đây là tập lệnh trình bao, ví dụ: CMD runmyserver.sh, sau đó việc giải thích các biến trình bao sẽ bị trì hoãn cho đến khi CMD thực sự chạy.

Vì vậy, hãy thử

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

như một kịch bản shell?

32

Câu trả lời này có thể hơi trễ một chút. Nhưng môi trường cho CMD được diễn giải hơi khác nhau tùy thuộc vào cách bạn viết các đối số. Nếu bạn vượt qua các CMD như là một chuỗi (không phải bên trong một mảng), nó được đưa ra như là một vỏ thay vì exec. Xem https://docs.docker.com/engine/reference/builder/#cmd.

Bạn có thể thử các CMD mà không có cú pháp mảng để chạy như một vỏ:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT 
9

Cả Andys đã đúng. Cú pháp json bỏ qua điểm vào. Khi bạn sử dụng CMD như trong ví dụ của họ, nó được coi là một đối số cho điểm nhập mặc định: /bin/sh -c sẽ diễn giải các biến môi trường.

Trình kết nối không đánh giá các biến trong CMD trong cả hai trường hợp. Trong phần trước, lệnh được gọi trực tiếp nên không có gì được giải thích, sau này, các biến được diễn giải bởi sh.

8
CMD ["sh", "-c", "echo ${MY_HOME}"] 

Trả lời từ sffits here.

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