访问存储在Docker卷中的文件

时间:2018-03-09 09:28:40

标签: docker

我正在阅读以下https://developer.atlassian.com/blog/2016/06/common-dockerfile-mistakes/,并了解了一个部分:

  

运行时,会添加图片中的卷   容器,而不是你构建它时。你永远不应该与你的互动   在构建过程中声明的卷,因为它应该只在使用时使用   你运行你的容器。

     

示例:在构建过程中创建文件,然后运行cat on   图像运行后的文件工作正常:

FROM ubuntu:12.04
RUN echo "Hello Charlie!" > /test.txt

CMD ["cat", "/test.txt"]

$ docker run test-build-volume
Hello Charlie!
     

如果我尝试对存储在卷中的文件执行相同的操作   它不起作用:

FROM ubuntu:12.04
RUN echo "Hello Charlie!" > /var/data/test.txt

CMD ["cat", "/var/data/test.txt"]

$ docker run test-build-volume
cat: can't open '/var/data/test.txt': No such file or directory

我没看到第二个例子有什么问题?是不正确的(错字?)。我看到的唯一区别是/test.txt替换为/var/data/test.txt,我看不出他们应该使用相同的问题吗? Docker中有什么基础我错过了吗?

2 个答案:

答案 0 :(得分:0)

/ var / data不存在。 您的docker build必须发出此警告。

尝试使用/ var / log替换/ var / data 这将有效。

答案 1 :(得分:0)

GSUgambit关于echo默默失败是正确的,但是(删除了相关帖子)。

恕我直言,这个例子是不可验证的,它缺少如何Start a container with a volume的细节,没有说清楚/var/data在构建时是不存在的,以及后来创建时你运行一个容器(参见下面的案例1)。

一些可能有用的细节:

卷,SourceDestination字段& 2种不同的情况:

当您docker inspect带有卷的容器时,请注意两个字段:

  • Source(文件的主机位置)
  • Destination(文件的容器位置)

例如:

"Mounts": [
    {
        "Type": "volume",
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
         ...
    }
],

案例1:destination位置不存在

在这种情况下,带有卷选项的docker run ...将在容器中创建一个新的目标目录,例如:

$ docker run --rm -it -v test_volume:/this_folder_will_be_created ubuntu
root@6b80b9895dcc:/# cd /this_folder_will_be_created/
root@6b80b9895dcc:/this_folder_will_be_created#

案例2:destination位置存在

  

Populate a volume using a container

     

如果启动一个创建新卷的容器(如上所述),并且容器在要挂载的目录中有文件或目录(例如上面的/app/),则将目录的内容复制到卷中。