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
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": ""
            }
        ],

你可能感兴趣的:(Docker,Dockerfile,WORKDIR,VOLUME)