如何从代码中引用Docker卷?

时间:2018-03-01 21:52:27

标签: ruby windows docker dockerfile docker-volume

我是Docker的新手,我正在尝试了解如何从Docker容器内运行的代码与Docker卷进行交互。

我有一个非常基本的Ruby程序,需要创建一个文件。我希望程序创建的文件在运行之间保持不变。我想为了实现这一点,我需要使用Docker卷。

这是我的Dockerfile:

FROM ruby:2.1

RUN mkdir /app
WORKDIR /app

ADD . /app/
RUN bundle install -j 8

VOLUME ["app/data"]

ENTRYPOINT ["./bin/app.rb"]

既然我有一个卷,我的ruby程序将如何写入该位置?

如果我要在我的程序中做一些事情,比如:

config_file = "some/directory/config.yml"
File.open(config_file, 'w') { |file| file.write("Hello, from Docker!") }

我的问题是我会像config_file = "app/data"一样引用卷,而Ruby和Docker会知道目录“app / data”存在于卷中吗?

1 个答案:

答案 0 :(得分:3)

是的,你是对的。您在此路径中创建/修改的文件将保留在主机文件系统上。因此,它们在容器生命周期中存活下来。

要详细了解泊坞窗卷,请查看here

  

[...] Docker图片   存储为一系列只读层。当我们开始一个容器时,   Docker采用只读图像并在顶部添加读写层。   如果正在运行的容器修改现有文件,则会复制该文件   超出底层只读层并进入最顶层读写   应用更改的图层。读写中的版本   layer隐藏了底层文件,但没有销毁它。

您可以通过键入docker列出docker volume ls已知的所有卷。如果您想获得有关特定卷的更多信息,例如主机系统的 mountpoint 运行docker volume inspect VOLUME_NAME命令。

仅检索有关其已装入卷的容器特定信息,执行:

docker inspect -f '{{ .Mounts }}' CONTAINER_NAME

我强烈建议您使用命名卷,因为我发现它们更容易识别和管理。否则,卷名将是自动生成的隐秘哈希。 大多数情况下,我在docker-compose.yml

中定义它们
volumes:
  postgres_data: {}

services:
  postgres:   
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
  # ... other services like web, celery, etc.