說明
原文鏈接:https://blog.justwe.site/post/docker-arg-env/
在使用Dockerfile
構建鏡像的時候會感覺ARG
和ENV
的作用很相似, 但是這兩個存在就肯定有它的原因~
它們起作用的時機
-
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
。