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



我一直在尝试配置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 say:

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

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

当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上的入站连接;根本不接受来自容器外的任何连接,无论是来自同一物理主机、其他容器还是其他地方。">