我一直在尝试配置Docker卷以在主机之间共享文件,并使自己在容器中能够使用此文件。让我解释一下。
我有一个将puma用作Web服务器的Rails docker应用程序,我想使puma能够查看和使用ssl .key和.crt文件,因此,对于该项目,我也在“生产”中使用docker-compose模式”,但我不知道该如何进行。
我的设置是这样
/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
所以,我不知道现在该怎么办。有帮助吗?
答案 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>