Sử dụng các biến môi trường trong CMD


83

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

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"]

Trong đó $ MEMCACHE_11211_TCP_ * sẽ được đặt tự động bằng cách bao gồm tham số --link của docker runlệnh của tôi . Và $ ARG sẽ được người dùng định cấu hình trong thời gian chạy, có thể bởi tham số "-e"?

Điều này dường như không hiệu quả đối với tôi, nó dường như đang chuyển qua chuỗi "$ ARG" chẳng hạn.

Câu trả lời:


57

Câu trả lời này có thể hơi muộn. Nhưng môi trường cho CMDđược hiểu hơi khác một chút tùy thuộc vào cách bạn viết các đối số. Nếu bạn truyền vào CMDdưới dạng một chuỗi (không phải bên trong một mảng), nó sẽ được khởi chạy dưới dạng một trình bao thay vì thực thi. Xem https://docs.docker.com/engine/reference/builder/#cmd .

Bạn có thể thử CMDcú pháp không có mảng để chạy dưới dạng shell:

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


11

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

Docker không đánh giá các biến trong CMD trong cả hai trường hợp. Trước đây, lệnh được gọi trực tiếp để không có gì được giải thích, về sau, các biến được thông dịch bởi sh.


7

Tôi không thể nói về cách nó được cho là hoạt động, nhưng tôi nghĩ nếu bạn gọi đây là tập lệnh shell, chẳng hạn CMD runmyserver.sh, thì việc giải thích các biến shell sẽ bị hoãn lại 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?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.