我正在阅读以下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中有什么基础我错过了吗?
答案 0 :(得分:0)
/ var / data不存在。 您的docker build必须发出此警告。
尝试使用/ var / log替换/ var / data 这将有效。
答案 1 :(得分:0)
GSUgambit关于echo
默默失败是正确的,但是(删除了相关帖子)。
恕我直言,这个例子是不可验证的,它缺少如何Start a container with a volume的细节,没有说清楚/var/data
在构建时是不存在的,以及后来创建时你运行一个容器(参见下面的案例1)。
一些可能有用的细节:
Source
,Destination
字段& 2种不同的情况:当您docker inspect
带有卷的容器时,请注意两个字段:
Source
(文件的主机位置)Destination
(文件的容器位置)例如:
"Mounts": [
{
"Type": "volume",
"Name": "myvol2",
"Source": "/var/lib/docker/volumes/myvol2/_data",
"Destination": "/app",
...
}
],
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#
destination
位置存在Populate a volume using a container
如果启动一个创建新卷的容器(如上所述),并且容器在要挂载的目录中有文件或目录(例如上面的
/app/
),则将目录的内容复制到卷中。