docker中arg和env的區別是:arg是在build的時候存在的,可以在Dockerfile中當做變量來使用,而env是容器構建好之後的環境變量,不能在Dockerfile中當參數使用。
本教學操作環境:linux7.3系統、docker-1.13.1版、Dell G3電腦。
在使用docker-compoe 構建映像的時候會感覺ARG 和ENV 的作用很相似, 但是這兩個存在就肯定有它的原因
它們起作用的時機
arg 是在build 的時候存在的, 可以在Dockerfile 中當做變數來使用
#env 是容器建置好之後的環境變數, 不能在Dockerfile 中當參數使用
#從這裡可以看出來ARG 就是專門為建構鏡像而生的
拿一個具體的例子
# Dockerfile FROM redis:3.2-alpine LABEL maintainer="GPF <5173180@qq.com>" ARG REDIS_SET_PASSWORD=developer ENV REDIS_PASSWORD ${REDIS_SET_PASSWORD} VOLUME /data EXPOSE 6379 CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]
這是一個構建redis 的文件, 中間有這麼一句
ARG REDIS_SET_PASSWORD=developer ENV REDIS_PASSWORD ${REDIS_SET_PASSWORD}
它是為
CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]
這一句服務的, 這句就是在啟動redis 的時候設定密碼, 因為當執行CMD 的時候,說明容器已經建構成功運行了起來,此時CMD是在容器中執行容器中的命令, 因此CMD 中的變數是用的環境變數而不是在Dockerfile 中的變數,因此需要把ARG 中的值在建構的時候賦值給ENV
另一個使用ARG 的例子
FROM nginx:1.13.1-alpine LABEL maintainer="GPF <5173180@qq.com>" #https://yeasy.gitbooks.io/docker_practice/content/image/build.html RUN mkdir -p /etc/nginx/cert \ && mkdir -p /etc/nginx/conf.d \ && mkdir -p /etc/nginx/sites COPY ./nginx.conf /etc/ngixn/nginx.conf COPY ./conf.d/ /etc/nginx/conf.d/ COPY ./cert/ /etc/nginx/cert/ COPY ./sites /etc/nginx/sites/ ARG PHP_UPSTREAM_CONTAINER=php-fpm ARG PHP_UPSTREAM_PORT=9000 RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf VOLUME ["/var/log/nginx", "/var/www"] WORKDIR /usr/share/nginx/html
這裡就只是用了ARG
ARG PHP_UPSTREAM_CONTAINER=php-fpm ARG PHP_UPSTREAM_PORT=9000 RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf
這裡的變數用的就是ARG 而不是ENV了,因為這條指令運行在Dockerfile 當中的, 像這種臨時使用一下的變數沒必要存環境變數的值就很適合使用ARG
推薦學習:《docker影片教學》
以上是docker中arg和env的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!