Làm cách nào để sử dụng biến môi trường Docker trong mảng ENTRYPOINT?


109

Nếu tôi đặt một biến môi trường, giả sử ENV ADDRESSEE=worldvà tôi muốn sử dụng nó trong tập lệnh điểm nhập được nối thành một chuỗi cố định như:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

với worldgiá trị của biến môi trường, làm cách nào để làm điều đó? Tôi đã thử sử dụng "Hello, $ADDRESSEE"nhưng điều đó dường như không hoạt động, vì nó theo $ADDRESSEEnghĩa đen.

Câu trả lời:


216

Bạn đang sử dụng biểu mẫu thực thi của ENTRYPOINT. Không giống như biểu mẫu shell , biểu mẫu thực thi không gọi ra một trình bao lệnh. Điều này có nghĩa là quá trình xử lý vỏ bình thường không xảy ra. Ví dụ: ENTRYPOINT [ "echo", "$HOME" ]sẽ không thay thế biến trên $ HOME. Nếu bạn muốn xử lý vỏ sau đó, hoặc sử dụng các hình thức vỏ hoặc thực hiện một vỏ trực tiếp, ví dụ: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Khi sử dụng biểu mẫu thực thi và thực thi trực tiếp một trình bao, như trong trường hợp đối với biểu mẫu trình bao, đó là trình bao đang thực hiện mở rộng biến môi trường, không phải docker . (Từ tham chiếu Dockerfile )

Trong trường hợp của bạn, tôi sẽ sử dụng dạng shell

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$porttrong khi ENV port=123. Cổng ENV không được giải quyết. Bất kỳ ý tưởng tại sao?
xetra11

1
Trong khi nó hoạt động, nó dường như tạo ra một số vấn đề mới, chẳng hạn như không bao gồm các đối số được truyền vào điểm nhập đó. Ví dụ, bạn không thể thêm một --attitude "shouting"tham số cho docker runlệnh đó nên được thông qua để./greeting
Daniel F

5
Sử dụng ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"nếu bạn cũng muốn vượt qua các biến bổ sung ./greetingthông qua docker rungọi (hoặc để vượt qua CMDcác Dockerfile)
Daniel F

3
Lưu ý rằng biểu mẫu trình bao có thể khiến các tín hiệu không được chuyển đến quy trình ( greetingtrong ví dụ của bạn). hynek.me/articles/docker-signals
jbg

tôi có thể lấy giá trị của một biến môi trường ở dạng thực thi, chẳng hạn như `[myexecutable.sh," $ variable "], tôi có thể làm điều đó bằng [" sh "," -c "," echo $ var "], nhưng không theo cách này
lazarus

13

Tôi đã cố gắng giải quyết bằng câu trả lời được đề xuất và vẫn gặp phải một số vấn đề ...

Đây là một giải pháp cho vấn đề của tôi:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

Nhắm mục tiêu cụ thể vấn đề của bạn:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

có vẻ như câu trả lời của bạn không cung cấp giải pháp hoàn chỉnh của OP câu hỏi
user9405863

Tôi cho rằng tôi không hiểu bằng cách nào mà nó không cung cấp giải pháp cho câu hỏi của OP ... Tôi đã cập nhật một ví dụ để giải quyết câu hỏi chính xác trong tâm trí.
Ben Kauffman

bạn vẫn đề cập bạn đã gặp phải một số vấn đề !!
user9405863

đúng, đó là lý do tại sao tôi giới thiệu một giải pháp mới. ... câu trả lời "được chấp nhận" không phù hợp với tôi, vì vậy tôi lặp lại với một tập lệnh shell và điều đó đã hoạt động.
Ben Kauffman

2
Tôi muốn được quan tâm trong buổi điều trần cách tiếp cận của bạn sau đó @ReverendTim;)
Bến Kauffman

6

Sau nhiều đau đớn và sự trợ giúp đắc lực từ @vitr và cộng sự ở trên, tôi quyết định thử

  • thay thế bash tiêu chuẩn
  • dạng shell của ENTRYPOINT (mẹo tuyệt vời từ phía trên)

và điều đó đã hiệu quả.

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

ví dụ

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

docker run --rm -p 8080:80 -d my-image

cả hai đều đặt cổng chính xác trong vùng chứa của tôi

Refs

xem https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

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.