Làm cách nào để xác định một biến trong Dockerfile?


155

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 ENVhướ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?


10
bạn có thể sử dụng ARG - xem docs.docker.com/engine/reference/builder/#arg
lumos0815

@ lumos0815, tôi nghĩ bạn nên đăng nó dưới dạng câu trả lời của bạn (mặc dù đó là một bài viết cũ; cho hậu thế) vì đó chính xác là những gì OP đang yêu cầu.
hét lên

ARG không định nghĩa một var có thể được sử dụng trong dockerfile. Bạn sẽ phải kết hợp điều đó với lệnh ENV để có được thứ bạn đang tìm kiếm; ARG foo; ENV FOO = $ foo; Tệp COPY $ foo (xin lỗi vì định dạng xấu, tôi đoán không thể thực hiện các khối mã và nhiều dòng từ điện thoại)
ntwrkguru

Câu trả lời:


111

Bạn có thể sử dụng ARG- xem https://docs.docker.com/engine/reference/builder/#arg

Các ARGhướ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ác docker buildlệ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.


@MargachChris có thể sử dụng các biến cho COPY
lumos0815

Nó dường như không hoạt động cho lệnh COPY. docs.docker.com/engine/reference/builder/#arg
xương đùi

54

Theo hiểu biết của tôi, chỉ ENVcho 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 ENVcâ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 ARGmộ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, ARGlà đủ: 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.


51

Để 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

13

Nếu biến được sử dụng lại trong cùng một RUNlệ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 .


Câu trả lời chính xác. Mặc dù bạn nên sử dụng ARG nếu có thể, đôi khi bạn cần gán và sử dụng lại một biến động. Ví dụ:RUN foo=$(date) && echo $foo
wvducky

3

Bạn có thể sử dụng ARG variable defaultValuevà 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ư $variabletrong lệnh run.

Lưu ý: Các biến này sẽ có sẵn cho các lệnh Linux như RUN echo $variablevà chúng sẽ không tồn tại trong ảnh.

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.