docker中 arg 和 env 的區別

說明

原文鏈接:https://blog.justwe.site/post/docker-arg-env/

在使用Dockerfile構建鏡像的時候會感覺ARGENV的作用很相似, 但是這兩個存在就肯定有它的原因~

它們起作用的時機

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

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

從這裏可以看出來ARG就是專門爲構建鏡像而生的。

實戰

構建一個redis

# Dockerfile
FROM redis:3.2-alpine

LABEL maintainer="GPF <[email protected]>"

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

構建一個nginx

FROM nginx:1.13.1-alpine

LABEL maintainer="GPF <[email protected]>"

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章