Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从docker中的卷映射opt复制到图像opt文件夹?_Docker - Fatal编程技术网

如何从docker中的卷映射opt复制到图像opt文件夹?

如何从docker中的卷映射opt复制到图像opt文件夹?,docker,Docker,假设我有一个码头工人的形象 FROM openjdk:8-jdk-slim WORKDIR /opt COPY localfile ../imagefile 我可以创建我的docker映像docker build-t我的映像。并将我的本地localfile映像设置为。/imagefile 我也可以通过 Rundocker Run-it--name my container--volume=$(pwd):/opt--workdir=/opt openjdk:8-jdk-slim 然后cp loc

假设我有一个码头工人的形象

FROM openjdk:8-jdk-slim
WORKDIR /opt
COPY localfile ../imagefile
我可以创建我的docker映像
docker build-t我的映像。
并将我的本地
localfile
映像设置为
。/imagefile

我也可以通过

  • Run
    docker Run-it--name my container--volume=$(pwd):/opt--workdir=/opt openjdk:8-jdk-slim
  • 然后
    cp localfile../imagefile
  • 然后退出
  • 然后通过运行
    docker commit my container my image
  • 两者都产生等效的
    my image

    但是,如果我将Dockerfile更改为下面的

    FROM openjdk:8-jdk-slim
    WORKDIR /opt
    COPY localfile imagefile
    
    我可以使用
    docker build-t my image构建映像。
    。但是,我无法
    cp localfile imagefile
    ,因为
    cp
    只会将文件复制到映射到
    opt
    文件夹的原始磁盘卷文件夹,而不会复制到实际的图像
    opt
    文件夹

    当我的
    opt
    映射到本地文件夹时,是否还有办法将我的文件复制到image
    opt
    文件夹(而不是本地文件夹)


    或者另一种提问方式,当我以交互方式运行容器以创建图像时,是否可以使用等效的
    COPY
    命令?

    关于这个问题,有两个重要的细节:

  • 如果您将某个内容装载到Docker容器中(或者在Linux主机上),它将隐藏该目录中以前的内容;您无法直接查看或访问它
  • 特别是在Docker中,如果不删除并重新创建容器,从而删除容器文件系统,就无法更改装载
  • 因此,一方面,您不能从装载的卷复制到同一位置的容器文件系统;另一方面,即使可以,也(几乎)无法查看文件系统的内容

    (正如您所注意到的,
    docker commit
    将创建容器文件系统的映像,忽略卷,这样就会看到这一点。不过,使用
    docker commit
    并不是一个真正的最佳实践;如您所示,通过dockerfile构建映像和使用
    docker build
    几乎总是首选。)


    一般来说,我发现卷装载在三个方面很有用,其中隐藏容器内容是可以接受的,甚至是预期的。您可以使用mounts将配置文件注入容器(您希望在其中覆盖映像的副本)。您可以使用挂载将日志文件读回(您不关心映像以什么开头)。如果您有一个有状态的工作负载,比如数据库,那么您可以使用挂载来保存需要持久化的数据(这样它就在容器文件系统之外)。

    我想您是在问如何将文件从本地复制到容器?如果是这样,您可以使用docker cp。文档可以在这里找到。我无法交互使用
    docker cp
    。我对您的工作流程有点困惑。如果你正在用更新的文件重建你的图像(一个好主意),为什么你要在上面挂载内容;如果您要在其上装载内容,为什么需要将文件复制到容器文件系统空间中的其他位置?您提出了一个好问题@DavidMaze。我可以将它映射到容器中不存在的文件夹,这将解决整个问题。我只是好奇,如果我将它映射到容器中已经存在的文件夹,我想知道是否有方法将我拥有的内容从本地文件夹移动到容器原始文件夹(例如opt)。主要是为了了解这种功能是否存在或不受支持;无法查看您与卷一起隐藏的容器文件系统。唯一的例外是
    docker commit
    ,使用它从来都不是最佳实践。