Ruby 如何从代码引用Docker卷?

Ruby 如何从代码引用Docker卷?,ruby,windows,docker,dockerfile,docker-volume,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 ["./b

我是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\u file=“app/data”
一样引用卷,Ruby和Docker会知道目录“app/data”位于卷中?

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

要详细了解docker卷,请查看

[…]Docker图像 存储为一系列只读层。当我们启动一个容器时, Docker获取只读图像,并在其顶部添加一个读写层。 如果正在运行的容器修改现有文件,则会复制该文件 脱离底层只读层,进入最顶层的读写 应用更改的图层。读写模式中的版本 图层隐藏基础文件,但不销毁它

您可以通过键入
docker volume ls
列出
docker已知的所有卷。如果要获取有关特定卷的更多信息,例如主机系统的装入点,请运行
docker volume inspect volume\u NAME
命令

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

docker-inspect-f'{.Mounts}}'容器名称

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

volumes:
  postgres_data: {}

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