配置Docker卷以在主机和容器之间共享数据

时间:2018-11-22 22:11:25

标签: ruby-on-rails docker ssl docker-compose

我一直在尝试配置Docker卷以在主机之间共享文件,并使自己在容器中能够使用此文件。让我解释一下。

我有一个将puma用作Web服务器的Rails docker应用程序,我想使puma能够查看和使用ssl .key和.crt文件,因此,对于该项目,我也在“生产”中使用docker-compose模式”,但我不知道该如何进行。

我的设置是这样

  • Ubuntu 18.04服务器生产主机在/home/ubuntu/my_app_keys中包含ssl文件,这些容器也在我的主机中。

/home/ubuntu/docker-compose.yml

version: '3'

services:
  postgres:
    image: postgres:10.5
    environment: 
      POSTGRES_DB: my_app_production
    env_file:
      -~/production.env

  redis:
    image: redis:4.0.11

  web:
    image: my_app:latest
    command: bundle exec rails server -p 3000 -b 'ssl://127.0.0.1:3000?key=/home/ubuntu/my_app_keys/server.key&cert=/home/ubuntu/my_app_keys/server.crt' -e production
    ports:
      - '3000:3000'
    volumes:
      - /home/ubuntu/my_app_keys
    depends_on:
      - postgres
      - redis
    env_file:
      - ~/production.env
    restart: always

  sidekiq:
    image: my_app_sidekiq:latest
    command: bundle exec sidekiq -C config/sidekiq.yml
    depends_on:
      - postgres
      - redis
    env_file:
      - ~/production.env
    restart: always

因此,如您所见:command: bundle exec rails server -p 3000 -b 'ssl://127.0.0.1:3000?key=/home/ubuntu/my_app_keys/server.key&cert=/home/ubuntu/my_app_keys/server.crt'在/ home / ubuntu / my_app_keys中寻找ssl文件,当我执行docker-compose up时puma找不到ssl文件并退出:

/usr/local/bundle/gems/puma-3.9.1/lib/puma/minissl.rb:180:in `key=': No such key file '/home/ubuntu/my_app_keys/server.key' (ArgumentError)

我认为是因为key=/home/ubuntu/my_app_keys/server.key&cert=/home/ubuntu/my_app_keys/server.crt指向容器上下文,但是我的主机上下文中包含证书和密钥

因此,我将其包含在docker compose卷中以绑定安装文件:

volumes:
  - /home/ubuntu/my_app_keys

但没有运气,同样的错误。

在容器上下文中,我的应用程序位于/var/www/my_app目录中,因此我尝试指定一个绝对路径(出于某种原因,我认为这是因为ssl文件不在我的应用程序所在的目录中,不共享),因此我以compose-file docs的名义添加:

volumes:
  - /home/ubuntu/my_app_keys:/var/www/my_app

并更改撰写文件:

command: bundle exec rails server -p 3000 -b 'ssl://127.0.0.1:3000?key=server.key&cert=server.crt' -e

当我执行撰写我的Web服务出口时出现错误:

web | Could not locate Gemfile or .bundle/ directory

运行Web服务的唯一方法是(但不存在ssl文件):

volumes:
  - /home/ubuntu/my_app_keys

所以,我不知道现在该怎么办。有帮助吗?

1 个答案:

答案 0 :(得分:0)

当您的Docker Compose YAML文件说:

volumes:
  - /home/ubuntu/my_app_keys

这意味着,“使容器空间中的/home/ubuntu/my_app_keys在容器重新启动后持续存在;除非Dockerfile做了一些特殊的事情,否则它将开始为空;它未连接到任何特定的主机内容”。

当你说:

volumes:
  - /home/ubuntu/my_app_keys:/var/www/my_app

这意味着“用主机上的/var/www/my_app的内容完全替换容器空间中的/home/ubuntu/my_app_keys的内容”。 (主机空间和容器空间中的路径名不必相同。)

作为奖励问题,当您说:

rails server -b 'ssl://127.0.0.1:3000?...'

这意味着,“仅侦听从此Docker容器内部发起的端口3000上的入站连接;根本不接受来自容器外部的任何连接,无论是来自同一物理主机,其他容器还是其他位置。” < / p>