Dockerfile: WORKDIR vs VOLUME

2023-12-29 02:20
文章标签 vs volume dockerfile workdir

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548059

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[

Apache Kylin VS Apache Doris全方位对比

1 系统架构 1.1 What is Kylin1.2 What is Doris2 数据模型 2.1 Kylin的聚合模型2.2 Doris的聚合模型2.3 Kylin Cuboid VS Doris RollUp2.4 Doris的明细模型3 存储引擎4 数据导入5 查询6 精确去重7 元数据8 高性能9 高可用10 可维护性 10.1 部署10.2 运维10.3 客服11 易用性 11.1