docker中arg和env的區別是什么

docker中arg和env的區別是:arg是在build的時候存在的,可以在Dockerfile中當做變量來使用,而env是容器構建好之后的環境變量,不能在Dockerfile中當參數使用。

docker中arg和env的區別是什么

本教程操作環境:linux7.3系統、docker-1.13.1版、Dell G3電腦。

docker中arg和env的區別是什么

在使用 docker-compoe 構建鏡像的時候會感覺 ARG 和 ENV 的作用很相似, 但是這兩個存在就肯定有它的原因

它們起作用的時機

  • arg 是在 build 的時候存在的, 可以在 Dockerfile 中當做變量來使用

  • env 是容器構建好之后的環境變量, 不能在 Dockerfile 中當參數使用

從這里可以看出來 ARG 就是專門為構建鏡像而生的

拿一個具體的例子

#?Dockerfile FROM?redis:3.2-alpine LABEL?maintainer="GPF?" 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?" #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視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享