Docker渐渐成为前端的一个工具,它像一个通用包装,可以把各种环境包裹其中,从而实现跨设备的兼容。使用的过程中,往往会需要将本地的文件和docker容器内部的文件互传:将主机的文件传递给容器内,让里面的工具读写;将容器内的文件拷贝出来,修改了再传入...
一、主机到 Docker 容器/镜像的文件传输
将文件从主机传输到容器或镜像中,可以在容器启动前或容器运行时进行。
1. 使用 COPY
或 ADD
指令(构建镜像时)
当你在创建Docker 镜像
时,Dockerfile 提供了两条指令 COPY
和 ADD
,它们用于将主机上的文件复制
到镜像中。
COPY
指令:将主机的文件或目录复制到镜像的指定路径。ADD
指令:除了COPY
的功能外,还支持复制远程文件(如 URL)并自动解压压缩文件(如.tar
)。
示例
# 从主机的工作目录将文件复制到镜像的 /app 目录 # 或者使用 ADD 指令(可以解压 .tar 文件) ADD ./myarchive.tar.gz /app
这种方式适用于在构建镜像时预先将主机文件打包进镜像内。它的优点是镜像内的文件是静态的,适合分发和部署。
需要注意的是,复制文件不能跨越上下文,比如你构建的镜像在 /a/b/c目录,无法将/a目录下的文件复制到镜像内,或是COPY ../xxx 的也不行***
2. 使用 docker run
的 -v
选项(容器启动时挂载卷)
当容器启动时,可以通过 -v
或 --mount
选项将主机目录挂载到容器中。这种方法不会将文件打包进镜像,而是在容器运行时实时访问主机上的文件。
示例
docker run -v /path/on/host:/path/in/container my-container
在此示例中,主机的 /path/on/host
目录会挂载到容器的 /path/in/container
目录中。容器中的应用可以实时访问和修改主机上的文件,这种方式非常适合开发时同步文件。
3. 使用 docker cp
命令(运行时复制)
docker cp
命令允许在容器运行时将文件从主机复制到容器中。
示例:
docker cp /path/on/host my-container:/path/in/container
这种方式适合偶尔的文件传输,不需要重启容器。你可以在容器运行时向容器内添加或更新文件。
二、Docker 容器/镜像到主机的文件传输
Docker 同样提供多种方法将文件从容器或镜像传输到主机中。
1. 使用 docker cp
命令
最直接的方法是使用 docker cp
命令,它允许从正在运行的容器或已经停止的容器中将文件复制到主机。docker cp
是一个非常灵活的工具,它既支持文件也支持目录的传输。
示例:
docker cp my-container:/path/in/container /path/on/host
即使容器已经停止,docker cp
仍然可以工作,因为 Docker 会保留容器的文件系统状态,直到容器被删除。
2. 在容器启动时挂载卷(双向传输)
如前所述,使用 docker run -v
或 --mount
选项可以实现主机与容器之间的文件共享。由于这是双向传输,因此容器对挂载卷中数据的修改会同步到主机上。
示例:
docker run -v /path/on/host:/path/in/container my-container
容器内的任何文件更改都会反映在主机的 /path/on/host
目录中。这种方式对于需要实时同步数据的情况非常有效,例如开发时频繁修改的文件。
3. 延伸之复制镜像文件到本地
此时就需要用docker run使用镜像启动容器,然后再利用docker cp复制到本地
三、适合场景的选择
-
使用
COPY
/ADD
指令:适合在构建镜像时静态地将文件打包进镜像,适合用于镜像的分发和部署。 -
使用
docker run -v
挂载卷:适合开发环境或需要实时同步文件的场景,避免了每次修改文件都需要重启容器。 -
使用
docker cp
:适合容器运行时或容器停止后从容器中提取文件,适用于需要从容器中临时获取或更新文件的情况。
四、注意事项
-
权限问题:在挂载主机目录到容器时,容器内的用户权限可能会与主机用户不一致,导致文件无法访问或修改。可以通过设置正确的权限或用户来解决这个问题。
-
容器挂掉后的文件传输:即使容器已经停止,
docker cp
仍然可以从停止的容器中提取文件。容器删除前,文件系统状态会被保留。 -
性能影响:在使用
-v
挂载卷时,主机与容器间的文件交互性能可能会受到一定影响,特别是在处理大量文件时,需要测试性能是否满足要求。
相信看到这里,记得动手操练下。相信你就能够熟练掌握docker和主机之间的文件互转了,其实docker就是一个文件系统的描述,一层层的累起来,镜像是抽象的定义类似Class,容器类似实例化的对象,通过多种方法实现容器和主机的文件互转就可以,甚至可通过http哦