海南网站制作公司,招聘网站建设技术要求,用手机可以做网站,公司起名自动生成器文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境
RHEL 9.3Docker Community 24.0.7
总结
如果懒得看测试的详细信息#xff0c;可以直接看结果#xff1a;
一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用… 文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境
RHEL 9.3Docker Community 24.0.7
总结
如果懒得看测试的详细信息可以直接看结果
一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用双引号引起来如果用了双引号也会自动被去掉。环境变量的值如果包含空格可以用双引号引起来或者用 \ 将其转义。环境变量的值如果包含双引号可以用 \ 将其转义。在 ENV 指令里可以引用之前的 ENV 指令里定义的环境变量。在同一条 ENV 指令里无法互相引用 如果是本条指令里新定义的变量则当作没有定义。如果是之前指令里定义过本条指令里有修改的变量则获取的仍然是之前指令里的值。 在启动容器时可以通过 --env 选项覆盖Dockerfile里设置的环境变量。stage会继承其parent image的环境变量。如果只是构建期的变量不要用 ENV 指令否则会影响image使用。如果想要unset变量需要把set和unset放到同一个 RUN 指令里。
测试
测试1
创建 Dockerfile 文件如下
FROM alpineENV VAR1value1 VAR2value2 VAR3hello world \VAR4hello\ world ENV VAR5He said: \Its good!\构建
docker build -t kai0108_1 .启动容器查看环境变量
➜ ~ docker run kai0108_1 env
VAR1value1
VAR2value2
VAR3hello world
VAR4hello world
VAR5He said: Its good!注只列出了相关的环境变量。
总结
一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用双引号引起来如果用了双引号也会自动被去掉。环境变量的值如果包含空格可以用双引号引起来或者用 \ 将其转义。环境变量的值如果包含双引号可以用 \ 将其转义。
测试2
创建 Dockerfile 文件如下
FROM alpineENV VAR1value1 VAR2aaa${VAR1}bbbENV VAR3ccc${VAR1}dddENV VAR4value4ENV VAR5aaa${VAR4}bbb VAR6ccc${VAR5}dddENV VAR7value7ENV VAR7value8 VAR8aaa${VAR7}bbb启动容器查看环境变量
➜ ~ docker run kai0108_2 env
VAR1value1
VAR2aaabbb
VAR3cccvalue1ddd
VAR4value4
VAR5aaavalue4bbb
VAR6cccddd
VAR7value8
VAR8aaavalue7bbb总结
在 ENV 指令里可以引用之前的 ENV 指令里定义的环境变量。在同一条 ENV 指令里无法互相引用 如果是本条指令里新定义的变量则当作没有定义。如果是之前指令里定义过本条指令里有修改的变量则获取的仍然是之前指令里的值。
测试3
创建 Dockerfile 文件如下
FROM alpineENV VAR1value1启动容器设置环境变量 VAR1
➜ ~ docker run --env VAR1hello kai0108_3 env
VAR1hello总结
在启动容器时可以通过 --env 选项覆盖Dockerfile里设置的环境变量。
测试4
创建 Dockerfile 文件如下
FROM alpine AS baseENV VAR1value1FROM baseENV VAR2aaa${VAR1}bbb启动容器查看环境变量
➜ ~ docker run kai0108_4 env
VAR1value1
VAR2aaavalue1bbb总结
stage会继承其parent image的环境变量。
测试5
创建 Dockerfile 文件如下
FROM ubuntu:trustyENV DEBIAN_FRONTENDnoninteractiveRUN apt-get update apt-get install -y curl注 DEBIAN_FRONTENDnoninteractive 表示在 apt-get install 安装的过程中使用缺省设置不与用户交互比如弹出对话框当然如果不加 -y 选项还是会让用户确认安装的。在构建时无法与用户交互所以要设置该环境变量本例中安装 curl 其实并不会弹出对话框只是个示例。
构建
docker build -t kai0108_5 .注构建会非常慢因为要连接国外的网站。
启动容器并进入容器
docker run -it kai0108_5安装 mail-stack-delivery
apt-get -y install mail-stack-delivery注这里安装 mail-stack-delivery 只是为了测试安装过程中是否会弹出对话框。
在安装过程中本来应该会弹出如下对话框 但是实际上并没有弹出对话框。
原因很简单因为有环境变量 DEBIAN_FRONTENDnoninteractive 。
本来设置该环境变量只是为了在构建image时不与用户交互但是在image里也保留了该环境变量以至于影响了 apt-get install 的行为这可能会对用户造成困扰。
解决办法有两种
方法1在 RUN 指令里设置环境变量只对本指令有效
RUN DEBIAN_FRONTENDnoninteractive apt-get update apt-get install -y curl方法2通过 ARG 指令设置变量只在构建期有效
ARG DEBIAN_FRONTENDnoninteractive
RUN apt-get update apt-get install -y curl总结
如果只是构建期的变量不要用 ENV 指令否则会影响image使用。
测试6
创建 Dockerfile 文件如下
FROM alpineENV VAR1value1RUN echo aaa${VAR1}bbb /tmp/a.txtRUN unset VAR1RUN echo ccc${VAR1}ddd /tmp/b.txt构建
docker build -t kai0108_6 .启动容器并进入容器查看
➜ ~ docker run -it kai0108_6
/ # cat /tmp/a.txt
aaavalue1bbb
/ # cat /tmp/b.txt
cccvalue1ddd
/ # env
VAR1value1
......可见unset变量并不起作用。这是因为 ENV 指令会创建一个layer。
若想要unset变量需要把set和unset放到同一个layer里也就是同一个 RUN 指令里。
创建 Dockerfile 文件如下
FROM alpineRUN export VAR1value1 \ echo aaa${VAR1}bbb /tmp/a.txt \ unset VAR1 \ echo ccc${VAR1}ddd /tmp/b.txtRUN echo eee${VAR1}fff /tmp/c.txt构建
docker build -t kai0108_7 .启动容器并进入容器查看
➜ ~ docker run -it kai0108_7
/ # cat /tmp/a.txt
aaavalue1bbb
/ # cat /tmp/b.txt
cccddd
/ # cat /tmp/c.txt
eeefff
/ # env
HOSTNAME13dcd240cd01
SHLVL1
HOME/root
TERMxterm
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD/可见这次达到了预期的目的。
总结
如果想要unset变量需要把set和unset放到同一个 RUN 指令里。
参考
https://docs.docker.com/engine/reference/builder/#envhttps://docs.docker.com/develop/develop-images/instructions/#env