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

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