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