layout: post
title: dockerfile—环境变量
date: 2018-04-18
tags: [“Docker”,”自动化运维工具”]


一、ENV

1、ENV是用来设置docker的环境变量的指令。

Syntax

  1. ENV <key> <value>
  2. ENV <key>=<value> <key>=<value>....(可以设置多个环境变量)

实例:

  1. vim Dockerfile
  2. FROM busybox:latest
  3. LABEL maintainer="zhangshang<zhangshangbj@163.com>"
  4. #ADD index.html /data/web/html
  5. ENV documentroot=/data/web/html/index.html port=80/tcp
  6. RUN mkdir -p /data/web/html \
  7. && echo 'test RUN and CMD !' >${documentroot}
  8. EXPOSE ${port}
  9. CMD httpd -h /data/web/html -f
  10. CMD ["-h","/data/web/html","-f"]
  11. ENTRYPOINT ["httpd"]
  12. #构建镜像
  13. docker build . -t test2:v2
  14. docker run -itd -P --name=test2 test2:v2

查看容器信息

  1. [root@ansible_master file_02]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 605ef9042bf8 test2:v2 "/bin/sh -c 'httpd -..." 5 seconds ago Up 4 seconds 0.0.0.0:10000->80/tcp relaxed_austin
  4. [root@ansible_master file_02]# docker exec -it 605ef /bin/sh

2、通过ENV修改环境变量

实例,通过ENV修改指定nginx的对外开放端口

  1. FROM nginx:1.12-alpine
  2. LABEL maintainer="zhangshang<zhangshangbj@163.com>"
  3. ENV port=80/tcp
  4. EXPOSE ${port}
  5. COPY entrypoint.sh /bin/
  6. CMD ["nginx","-g","daemon off"]
  7. ENTRYPOINT ["/bin/entrypoint.sh"]

entrypoint.sh脚本

  1. #! /bin/sh
  2. port=${port:-80}
  3. if [ -n $port ] ; then sed -i "s@\{listen.*\)80@i\1${port}@" /etc/nginx/conf.d/default.conf
  4. fi
  5. exec "$@"

3、ENV指令可以在运行时替换

docker run -itd --name test1 --env port=8080 test1

4、在运行容器时使用—link 容器名,可以复制被指定容器内的环境变量到新的容器内

二、ARG指令(最新docker支持)

ARG指令实在构建docker镜像时使用的,而ENV实在run的时候使用的。

1、FROM指令支持由第一个FROM之前发生的任何ARG指令声明的变量。

  1. ARG CODE_VERSION=latest
  2. FROM base:${CODE_VERSION}
  3. CMD /code/run-app
  4. FROM extras:${CODE_VERSION}
  5. CMD /code/run-extras

在FROM之前声明的ARG在构建阶段之外,所以它不能在FROM之后的任何指令中使用。要使用在第一个FROM之前声明的ARG的默认值,请在构建阶段内使用没有值的ARG指令:

  1. ARG VERSION=latest
  2. FROM busybox:$VERSION
  3. ARG VERSION
  4. RUN echo $VERSION > image_version

2、ARG变量定义从它在Dockerfile中定义的行开始生效,而不是来自参数在命令行或其他地方使用的行。例如:

  1. 1 FROM busybox
  2. 2 USER ${user:-some_user}
  3. 3 ARG user
  4. 4 USER $user
  5. ...

用户通过调用以下命令构建该文件:

  1. $ docker build --build-arg user=what_user .

3、ARG指令在构建阶段结束时超出了范围。要在多个阶段使用arg,每个阶段都必须包含ARG指令。

  1. FROM busybox
  2. ARG SETTINGS
  3. RUN ./run/setup $SETTINGS
  4. FROM busybox
  5. ARG SETTINGS
  6. 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

要使用这些,只需使用标志在命令行上传递它们即可:

  1. --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的实例:

  1. HEALTHCHECK --interval=5m --timeout=3s \
  2. CMD curl -f http://localhost/ '' exit 1

五、SHELL(cmd、entrypoint都可以调用shell,/bin/sh)

使用SHELL指令指定cmd、entrypoint所执行的shell名称。

Syntax:

SHELL [“executable”,”parameters”]

六、ONBUILD

  1. ONBUILD [INSTRUCTION] 当图像被用作另一个构建的基础时,ONBUILD指令为图像添加一个稍后执行的触发指令。触发器将在下游构建的上下文中执行,就好像它已经在下游Dockerfile中的FROM指令之后立即插入一样。
文档更新时间: 2020-03-27 13:42   作者:张尚