我有一个使用docker compose设置的nginx容器,该容器使用主机上生成的证书。但是当我运行它时,它告诉我找不到证书。
nginx | nginx:[emerg] SSL_CTX_use_PrivateKey_file(“ / etc / letsnecrypt / live / example.com / privkey.key”)失败(SSL:错误:02001002:系统库:fopen:无此类文件或目录:fopen('/ etc / letsnecrypt /live/example.com/privkey.key','r')错误:20074002:BIO例程:file_ctrl:系统库错误:140B0002:SSL例程:SSL_CTX_use_PrivateKey_file:系统库)
但是当我使用docker-compose run nginx /bin/bash
进入容器并转到cert文件夹时,它们确实存在。
那我为什么会收到错误消息?
我的nginx conf:
server {
listen *:443;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsnecrypt/live/example.com/privkey.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
access_log /dev/stdout upstreamlog;
error_log /dev/stderr debug;
}
docker-compose.yml:
版本:“ 3.5”
services:
nginx:
container_name: nginx
image: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./nginx.default:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt
答案 0 :(得分:1)
您遇到的问题是在nginx启动之前,nginx容器中不存在证书文件。
您应该在启动容器之前复制证书。
尝试像这样在nginx文件夹下制作一个Dockfile:
FROM nginx:1.12.1-alpine
COPY letsencrypt /etc/letsencrypt/ /** letsencrypt folder contains certificatefiles **/
和您的docker-compose.yml应该这样:
services:
nginx-server:
build: ./nginx
volumes:
.......
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
container_name: nginx-server
答案 1 :(得分:1)
我不确定这是否可以回答问题,但这确实解决了与您非常相似的问题。
简短(可能)答案:
Certbot建立到live
中每个文件的软链接,再回到archive/domain.com/
中一个编号文件。
执行docker-compose up
时,软链接可能会以某种方式中断。
说明
我的设置遇到类似的问题,我的docker-compose.yml
的设置是这样的
services:
web:
image: nginx:alpine
volumes:
- ./letsencrypt/etc/live/${DOMAIN}/:/var/certs/:ro
./letsencrypt/etc/
是Certbot放置生成的证书的位置。
Certbot建立了从live
到../../archive/domain.com/
的软链接,因此当我执行docker-compose run web /bin/sh
来查看文件系统时,发现链接断开了!
/certs # ls -la
total 12
drwxr-xr-x 2 root root 4096 Aug 31 17:25 .
drwxr-xr-x 33 root root 4096 Aug 31 17:44 ..
-rw-r--r-- 1 root root 682 Aug 31 17:25 README
lrwxrwxrwx 1 root root 37 Aug 31 17:25 cert.pem -> ../../archive/domain.com/cert1.pem
lrwxrwxrwx 1 root root 38 Aug 31 17:25 chain.pem -> ../../archive/domain.com/chain1.pem
lrwxrwxrwx 1 root root 42 Aug 31 17:25 fullchain.pem -> ../../archive/domain.com/fullchain1.pem
lrwxrwxrwx 1 root root 40 Aug 31 17:25 privkey.pem -> ../../archive/domain.com/privkey1.pem
简单的解决方案是编辑docker-compose.yml
文件以返回几个目录。
services:
web:
image: nginx:alpine
volumes:
- ./letsencrypt/etc/${DOMAIN}/:/var/certs/:ro
nginx配置与新位置匹配后,nginx发现证书没有问题。