Trong Dockerfile của tôi , tôi muốn xác định các biến mà tôi có thể sử dụng sau này trong Dockerfile .
Tôi biết ENV
hướng dẫn, nhưng tôi không muốn các biến này là biến môi trường.
Có cách nào để khai báo các biến ở phạm vi Dockerfile không?
Trong Dockerfile của tôi , tôi muốn xác định các biến mà tôi có thể sử dụng sau này trong Dockerfile .
Tôi biết ENV
hướng dẫn, nhưng tôi không muốn các biến này là biến môi trường.
Có cách nào để khai báo các biến ở phạm vi Dockerfile không?
Câu trả lời:
Bạn có thể sử dụng ARG
- xem https://docs.docker.com/engine/reference/builder/#arg
Các
ARG
hướng dẫn định nghĩa một biến mà người dùng có thể vượt qua ít build-thời gian để các nhà xây dựng với cácdocker build
lệnh bằng cách sử dụng--build-arg <varname>=<value>
lá cờ. Nếu người dùng chỉ định đối số bản dựng không được xác định trong Dockerfile, bản dựng sẽ xuất hiện lỗi.
Theo hiểu biết của tôi, chỉ ENV
cho phép điều đó, như được đề cập trong " Thay thế môi trường "
Các biến môi trường (được khai báo bằng
ENV
câu lệnh) cũng có thể được sử dụng trong một số hướng dẫn nhất định dưới dạng các biến được Dockerfile diễn giải.
Chúng phải là các biến môi trường để được phân phối lại trong mỗi vùng chứa mới được tạo cho mỗi dòng của Dockerfile docker build
.
Nói cách khác, các biến đó không được giải thích trực tiếp trong Dockerfile, nhưng trong một thùng chứa được tạo cho dòng Dockerfile, do đó sử dụng biến môi trường.
Ngày này, tôi sử dụng cả ARG
( docker 1.10+, vàdocker build --build-arg var=value
) và ENV
.
Sử dụng ARG
một mình có nghĩa là biến của bạn hiển thị tại thời điểm xây dựng, không phải trong thời gian chạy.
Dockerfile của tôi thường có:
ARG var
ENV var=${var}
Trong trường hợp của bạn, ARG
là đủ: Tôi thường sử dụng nó để đặt biến http_proxy, nhu cầu xây dựng docker đó để truy cập internet khi xây dựng.
Để trả lời câu hỏi của bạn:
Trong Dockerfile của tôi, tôi muốn xác định các biến mà tôi có thể sử dụng sau này trong Dockerfile.
Bạn có thể định nghĩa một biến với:
ARG myvalue=3
Không gian xung quanh các nhân vật bằng nhau không được phép.
Và sử dụng nó sau:
RUN echo $myvalue > /test
Nếu biến được sử dụng lại trong cùng một RUN
lệnh, người ta có thể chỉ cần đặt biến shell. Tôi thực sự thích cách họ tiếp cận điều này với Ruby Dockerfile chính thức .
RUN foo=$(date) && echo $foo
Bạn có thể sử dụng ARG variable defaultValue
và trong lệnh chạy, bạn thậm chí có thể cập nhật giá trị này bằng cách sử dụng --build-arg variable=value
. Để sử dụng các biến này trong tệp docker, bạn có thể tham chiếu chúng như $variable
trong lệnh run.
Lưu ý: Các biến này sẽ có sẵn cho các lệnh Linux như RUN echo $variable
và chúng sẽ không tồn tại trong ảnh.