【注意】最后更新于 November 21, 2019,文中内容可能已过时,请谨慎使用。
在使用 docker-compoe
构建镜像的时候会感觉 ARG
和 ENV
的作用很相似, 但是这两个存在就肯定有它的原因
它们起作用的时机
- arg 是在 build 的时候存在的, 可以在 Dockerfile 中当做变量来使用
- env 是容器构建好之后的环境变量, 不能在 Dockerfile 中当参数使用
从这里可以看出来 ARG
就是专门为构建镜像而生的
拿一个具体的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 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 的文件, 中间有这么一句
1
2
|
ARG REDIS_SET_PASSWORD=developer
ENV REDIS_PASSWORD ${REDIS_SET_PASSWORD}
|
它是为
1
|
CMD ["sh", "-c", "exec redis-server --requirepass \"$REDIS_PASSWORD\""]
|
这一句服务的, 这句就是在启动 redis 的时候设置密码, 因为当执行 CMD
的时候,说明容器已经构建成功运行了起来,此时 CMD
是在容器中执行容器中的命令, 因此 CMD
中的变量是用的环境变量而不是在 Dockerfile
中的变量,因此需要把 ARG
中的值在构建的时候赋值给 ENV
另一个使用 ARG 的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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
1
2
3
|
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
文章作者
GPF
上次更新
2019-11-21
(be89be9)