layout: post
title: dockerfile—环境变量
date: 2018-04-18
tags: [“Docker”,”自动化运维工具”]
一、ENV
1、ENV是用来设置docker的环境变量的指令。
Syntax
ENV <key> <value>
ENV <key>=<value> <key>=<value>....(可以设置多个环境变量)
实例:
vim Dockerfile
FROM busybox:latest
LABEL maintainer="zhangshang<zhangshangbj@163.com>"
#ADD index.html /data/web/html
ENV documentroot=/data/web/html/index.html port=80/tcp
RUN mkdir -p /data/web/html \
&& echo 'test RUN and CMD !' >${documentroot}
EXPOSE ${port}
CMD httpd -h /data/web/html -f
CMD ["-h","/data/web/html","-f"]
ENTRYPOINT ["httpd"]
#构建镜像
docker build . -t test2:v2
docker run -itd -P --name=test2 test2:v2
查看容器信息
[root@ansible_master file_02]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605ef9042bf8 test2:v2 "/bin/sh -c 'httpd -..." 5 seconds ago Up 4 seconds 0.0.0.0:10000->80/tcp relaxed_austin
[root@ansible_master file_02]# docker exec -it 605ef /bin/sh
2、通过ENV修改环境变量
实例,通过ENV修改指定nginx的对外开放端口
FROM nginx:1.12-alpine
LABEL maintainer="zhangshang<zhangshangbj@163.com>"
ENV port=80/tcp
EXPOSE ${port}
COPY entrypoint.sh /bin/
CMD ["nginx","-g","daemon off"]
ENTRYPOINT ["/bin/entrypoint.sh"]
entrypoint.sh脚本
#! /bin/sh
port=${port:-80}
if [ -n $port ] ; then sed -i "s@\{listen.*\)80@i\1${port}@" /etc/nginx/conf.d/default.conf
fi
exec "$@"
3、ENV指令可以在运行时替换
docker run -itd --name test1 --env port=8080 test1
4、在运行容器时使用—link 容器名,可以复制被指定容器内的环境变量到新的容器内
二、ARG指令(最新docker支持)
ARG指令实在构建docker镜像时使用的,而ENV实在run的时候使用的。
1、FROM指令支持由第一个FROM之前发生的任何ARG指令声明的变量。
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
在FROM之前声明的ARG在构建阶段之外,所以它不能在FROM之后的任何指令中使用。要使用在第一个FROM之前声明的ARG的默认值,请在构建阶段内使用没有值的ARG指令:
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
2、ARG变量定义从它在Dockerfile中定义的行开始生效,而不是来自参数在命令行或其他地方使用的行。例如:
1 FROM busybox
2 USER ${user:-some_user}
3 ARG user
4 USER $user
...
用户通过调用以下命令构建该文件:
$ docker build --build-arg user=what_user .
3、ARG指令在构建阶段结束时超出了范围。要在多个阶段使用arg,每个阶段都必须包含ARG指令。
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS
FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
4、使用ARG变量
您可以使用ARG或ENV指令来指定RUN指令可用的变量。使用ENV指令定义的环境变量总是覆盖相同名称的ARG指令。
5、Docker有一组预定义的ARG变量,您可以在Dockerfile中使用没有相应的ARG指令的变量。
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
要使用这些,只需使用标志在命令行上传递它们即可:
--build-arg <varname>=<value>
例:
--build-arg HTTP_PROXY=http://user:pass@proxy.lon.example.com
三、STOPSIGNAL(向容器内的应用程序发出信号,终止或重启)
STOPSIGNAL指令设置将被发送到容器的系统呼叫信号以退出。这个信号可以是一个有效的无符号数字,与内核syscall表中的位置相匹配,例如9,或者SIGNAME格式的信号名称,例如SIGKILL。
syntax:
STOPSIGNAL signal
四、HEALTCHECK
HEALTHCHECK指令有两种形式:
HEALTHCHECK [选项] CMD命令(通过在容器内部运行命令来检查容器健康状况)
HEALTHCHECK NONE(禁用从基础映像继承的任何健康检查)
HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作。这可以检测到一些情况,例如即使服务器进程仍在运行,仍停留在无限循环中但无法处理新连接的Web服务器。
当容器具有指定的健康检查时,除了正常状态之外,它还具有健康状态。这种状态最初开始。每当健康检查通过时,它就会变得健康(无论以前处于何种状态)。经过一定次数的连续失败后,它变得不健康。
options 可以是如下指令:
--interval=DURATION
(default:30s
) 每次健康检查的间隔--timeout=DURATION
(default:30s
) 检测的超时时长,如果超过时长表示此次检测失败--start-period=DURATION
(default:0s
) 容器启动之后,多少秒内不做健康检查--retries=N
(default:3
) 检查失败的重试次数
健康监测的3中状态码
0:成功 - 容器运行正常并且可以使用
1:不健康 - 容器工作不正常2:保留 - 不使用此退出代码
2:保留 - 不要使用此退出代码
HEALTHCHECK的实例:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ '' exit 1
五、SHELL(cmd、entrypoint都可以调用shell,/bin/sh)
使用SHELL指令指定cmd、entrypoint所执行的shell名称。
Syntax:
SHELL [“executable”,”parameters”]
六、ONBUILD
ONBUILD [INSTRUCTION] 当图像被用作另一个构建的基础时,ONBUILD指令为图像添加一个稍后执行的触发指令。触发器将在下游构建的上下文中执行,就好像它已经在下游Dockerfile中的FROM指令之后立即插入一样。