本文主要是介绍Dockerfile: WORKDIR vs VOLUME,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
WORKDIR
WORKDIR指令为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。
如果WORKDIR不存在,它将被创建,即使它没有在任何后续Dockerfile指令中使用。
语法 :
WORKDIR dirpath
WORKDIR指令可以在Dockerfile中多次使用。如果提供了一个相对路径,它将相对于前一个WORKDIR指令的路径。例如:
# 这个Dockerfile中最后一个pwd命令的输出将是/a/b/c。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
WORKDIR指令可以解析之前使用ENV设置的环境变量。只能使用在Dockerfile中显式设置的环境变量。例如:
# 这个Dockerfile中最后一个pwd命令的输出是/path/$DIRNAME
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
VOLUME
用于在image中创建一个挂载目录,以挂载宿主机上的目录
语法:
VOLUME <path>
VOLUME ["path"]
解释:
path:代表容器中的目录,与docker run 不同,Dockerfile中不能指定宿主机目录,默认使用docker管理的挂载点
示例:
VOLUME ["/var/log/“]
VOLUME /myvol
案例
在实验dockerfile中的VOLUME 参数之前。
1) 我们先使用docker run -v 来指定一把看看
# 下面的命令是将宿主机上面的/home/data 目录挂载到了容器中/data 目录,无论在容器里面还是物理机中修改对应目录下面的内容,都会同步
[root@docker01 ~]# docker run --name test -it -v /home/data:/data centos /bin/sh
# 容器中加入一个文件
sh-4.4# cd /data/
sh-4.4# ls
sh-4.4# pwd
/data
sh-4.4# echo "hello" > 1.txt
sh-4.4# cat 1.txt
hello
# 物理机中查看一下
[root@docker01 dockerfiledaemon]# cat /home/data/1.txt
hello
# 查看一下容器的详情
[root@docker01 dockerfiledaemon]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c11c574a6e7 centos "/bin/sh" 3 minutes ago Up 3 minutes test
[root@docker01 dockerfiledaemon]# docker inspect 8c11c574a6e7
"Mounts": [
{
"Type": "bind",
"Source": "/home/data",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
2) 使用 docker run -v 参数,但不指定物理机的目录
# 启动一个docker 实例
[root@docker01 ~]# docker run --name test -it --rm -v /data centos /bin/sh
# 查看容器运行情况
[root@docker01 dockerfiledaemon]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d42f7d885c87 centos "/bin/sh" 6 seconds ago Up 4 seconds test
# 从下面可以看到,source 的路径是自动分配的一个目录
[root@docker01 dockerfiledaemon]# docker inspect d42f7d885c87
"Mounts": [
{
"Type": "volume",
"Name": "fa853d8d48b38edf36af1064854f5d85102c577dc2581184b979479be21495ed",
"Source": "/var/lib/docker/volumes/fa853d8d48b38edf36af1064854f5d85102c577dc2581184b979479be21495ed/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
3) 使用dockerfile中挂载点进行
通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。
通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。但在dockerfile中无法指定主机上对应的目录,是自动生成的。
# 新建一个dockerfile
FROM centos
VOLUME ["/data1","/data2"]
# 构建镜像
[root@docker01 dockerfiledaemon]# docker build -t volume:01 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : VOLUME ["/data1","/data2"]
---> Running in 2ac39c2c1918
Removing intermediate container 2ac39c2c1918
---> 65ce3fb0ff1a
Successfully built 65ce3fb0ff1a
Successfully tagged volume:01
[root@docker01 dockerfiledaemon]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
volume 01 65ce3fb0ff1a 14 seconds ago 209MB
# 创建一个容器
[root@docker01 dockerfiledaemon]# docker run -it --name volumename volume:01 /bin/sh
sh-4.4#
# 查看容器id
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
071fdcf0a2eb volume:01 "/bin/sh" 26 seconds ago Up 24 seconds volumename
# 查看挂载点,会发现一共有两个自动挂载的目录
[root@docker01 ~]# docker inspect 071fdcf0a2eb
"Mounts": [
{
"Type": "volume",
"Name": "479d38b89f7eb8cbf52fa4b50f1e7c0caf358707bca418a46dcc330b43983817",
"Source": "/var/lib/docker/volumes/479d38b89f7eb8cbf52fa4b50f1e7c0caf358707bca418a46dcc330b43983817/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "926f1a3c58d1574433b0488b1f8b0a88011e1143925621729c6ba5b8fd2b5150",
"Source": "/var/lib/docker/volumes/926f1a3c58d1574433b0488b1f8b0a88011e1143925621729c6ba5b8fd2b5150/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
这篇关于Dockerfile: WORKDIR vs VOLUME的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!