Chúng ta có thể chuyển các biến ENV qua dòng cmd trong khi xây dựng hình ảnh docker thông qua dockerfile không?


80

Tôi đang thực hiện một nhiệm vụ liên quan đến việc xây dựng hình ảnh docker với centOs làm cơ sở của nó bằng cách sử dụng Dockerfile . Một trong các bước bên trong tệp dockerfile cần đặt các biến ENV http_proxyhttps_proxy để hoạt động phía sau proxy.

Vì Dockerfile này sẽ được sử dụng bởi nhiều nhóm có các proxy khác nhau, tôi muốn tránh phải chỉnh sửa Dockerfile cho từng nhóm. Thay vào đó, tôi đang tìm kiếm một giải pháp cho phép tôi chuyển các biến ENV tại thời điểm xây dựng, ví dụ:

sudo docker build -e http_proxy = somevalue.

Tôi không chắc liệu đã có tùy chọn cung cấp điều này chưa. Tui bỏ lỡ điều gì vậy?


1
có vấn đề gì với việc vượt qua những cái đó trong thời gian chạy? Một cái gì đó như thế docker run -e http_proxy http://1.2.3.4:3128 -e https_proxy 1.2.3.4:3129nào? Tài liệu của docker run docs.docker.com/reference/commandline/run
user2915097

3
Vấn đề là một trong các bước bên trong tệp docker không thể cài đặt yum và nó không thành công nếu tôi không đặt các biến http / https ENV và không có cài đặt thích hợp, tôi không thể tạo hình ảnh. Vì vậy, docker run không giúp tôi ở đây.
Aniketh

Tôi e rằng bạn sẽ phải xây dựng các hình ảnh cụ thể, sự khác biệt duy nhất là giá trị của http_proxy (các) ONBUILD có thể hữu ích, nhưng tôi e rằng nó không phù hợp ở đây, hãy xem tài liệu docs.docker.com/reference/builder
user2915097

Này đã được thảo luận ở đây github.com/docker/docker/issues/4962 và một lần nữa ở đây github.com/docker/docker/pull/9176 và đóng cửa, vì vậy tại thời điểm này, có vẻ như bạn không có giải pháp
user2915097

Cảm ơn người dùng2915097 đã bình luận.
Aniketh

Câu trả lời:


121

Các vùng chứa có thể được tạo bằng cách sử dụng build arguments(trong Docker 1.9+) hoạt động giống như các biến môi trường.

Đây là phương pháp:

FROM php:7.0-fpm
ARG APP_ENV=local
ENV APP_ENV ${APP_ENV}
RUN cd /usr/local/etc/php && ln -sf php.ini-${APP_ENV} php.ini

và sau đó xây dựng một thùng chứa sản xuất:

docker build --build-arg APP_ENV=prod .

Đối với vấn đề cụ thể của bạn:

FROM debian
ENV http_proxy ${http_proxy}

và sau đó chạy:

docker build --build-arg http_proxy=10.11.24.31 .

Lưu ý rằng nếu bạn xây dựng các vùng chứa của mình với docker-compose, bạn có thể chỉ định các chuỗi xây dựng này trong docker-compose.ymltệp , nhưng không phải trên dòng lệnh. Tuy nhiên, bạn có thể sử dụng thay thế biến trong docker-compose.ymltệp, sử dụng biến môi trường .


8
Bởi vì tôi đã bỏ qua nó: Bạn cần ARG để nói với docker rằng một đối số xây dựng có thể được chuyển cho trình tạo. Nếu không chỉ định ARG <name>, nó không hoạt động.
Markus Bruckner

4
Điều này ENV APP_ENV ${APP_ENV}là không cần thiết. Nó đủ để có ARG APP_ENVkhông =localvà nó sẽ lấy xây dựng lập luận và sử dụng nó như bất kỳ bộ biến bằng cáchENV
ElmoVanKielmo

3
@ElmoVanKielmo Điều đó đúng trong quá trình xây dựng, nhưng ARGkhông tồn tại như một biến môi trường khi hình ảnh docker được chạy. Việc sử dụng ENV APP_ENV ${APP_ENV}đảm bảo rằng biến môi trường vẫn có sẵn khi vùng chứa đang chạy.
DuckPuppy

@DuckPuppy đúng nhưng tôi đã bám vào câu hỏi của OP
ElmoVanKielmo.

Câu hỏi của @ElmoVanKielmo OP là về việc chuyển ENVtừ dòng lệnh, vậy làm thế nào để có ARGmột mình giúp đỡ? Bạn cần ARGđể có thể chuyển một tệp --build-argvà sau đó bạn cần ENVsao chép nó vào một biến môi trường để được duy trì với hình ảnh.
haridsv

18

Vì vậy, tôi đã phải tìm kiếm điều này bằng cách thử và sai vì nhiều người giải thích rằng bạn có thể vượt qua ARG-> ENVnhưng nó không phải lúc nào cũng hoạt động vì nó rất quan trọng cho dù ARG được xác định trước hay sau FROMthẻ.

Ví dụ dưới đây sẽ giải thích rõ ràng điều này. Vấn đề chính của tôi ban đầu là tất cả ARGS của tôi đã được xác định trước FROMđó dẫn đến tất cả ENVluôn luôn là không xác định.

# ARGS PRIOR TO FROM TAG ARE AVAIL ONLY TO FROM for dynamic a FROM tag
ARG NODE_VERSION
FROM node:${NODE_VERSION}-alpine

# ARGS POST FROM can bond/link args to env to make the containers environment dynamic
ARG NPM_AUTH_TOKEN
ARG EMAIL
ARG NPM_REPO

ENV NPM_AUTH_TOKEN ${NPM_AUTH_TOKEN}
ENV EMAIL ${EMAIL}
ENV NPM_REPO ${NPM_REPO}

# for good measure, what do we really have
RUN echo NPM_AUTH_TOKEN: $NPM_AUTH_TOKEN && \
  echo EMAIL: $EMAIL && \
  echo NPM_REPO: $NPM_REPO && \
  echo $HI_5
# remember to change HI_5 every build to break `docker build`'s cache if you want to debug the stdout

..... # rest of whatever you want RUN, CMD, ENTRYPOINT etc..

3
WOW, dang, cũng xảy ra với tôi! Không ai nói về điều này, không có nơi nào trong tài liệu đề cập, cảnh báo, v.v.! Cảm ơn rất nhiều!!!
chrizzler

Tôi có thể đề cập đến điều này là rất quan trọng nếu môi trường triển khai của bạn là từ CI tự động. IE Tôi đã tìm thấy điều này khi tôi đang cố gắng tạo gitlab CI để mở rộng quy mô trên các miền của dự án. Dự án IE One có thể đang giải quyết một phiên bản nút khác nhau, v.v ...
Nick

2

Tôi đã đối mặt với tình huống tương tự.

Theo câu trả lời của Sin30, giải pháp khá tốt là sử dụng shell,

CMD ["sh", "-c", "cd /usr/local/etc/php && ln -sf php.ini-$APP_ENV php.ini"]
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.