docker - nginx ssl docker没有这样的文件或目录

标签 docker nginx docker-compose certbot

我有一个使用 docker compose 设置的 nginx 容器,它使用在主机上生成的证书。但是当我运行它时,它告诉我找不到证书。

nginx | nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/letsnecrypt/live/example.com/privkey.key") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsnecrypt/live/example.com/privkey.key','r') error:20074002:BIO routines:file_ctrl:system lib error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib)



但是当我使用 docker-compose run nginx /bin/bash 进入容器时并转到 cert 文件夹,它们确实存在。

那么为什么我会收到错误消息?

我的 nginx 配置:
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

最佳答案

我不确定这是否会回答这个问题,但这确实解决了我的问题,这与你的问题非常相似。

简短(可能)的答案:

Certbot 对 live 中的每个文件进行软链接(soft link)返回到 archive/domain.com/ 中的编号文件.

当您执行 docker-compose up 时,软链接(soft link)可能会以某种方式中断。 .

解释

我的设置有类似的问题,我的 docker-compose.yml是这样设置的

services:
  web:
    image: nginx:alpine
    volumes:
      - ./letsencrypt/etc/live/${DOMAIN}/:/var/certs/:ro
./letsencrypt/etc/是 Certbot 放置生成证书的地方。

Certbot 从 live 创建软链接(soft link)至../../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 发现证书没有问题。

关于docker - nginx ssl docker没有这样的文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853316/

相关文章:

docker - Docker 上的 Headless Chromium 失败

tomcat - 当代理服务器关闭时,NGINX 反向代理返回 502 错误网关

mysql - 尝试连接本地 mysql 数据库时,docker 容器上的 Django 出现错误

Mysql 拒绝连接到 Docker 上的管理员

java - 如何调试使用 Docker Compose 运行的 Glassfish 应用程序

docker - 为什么 zsh alias 不能正确评估嵌套命令?

docker - 从主机查询 docker 内嵌的 dns

docker - 如何在 Linux 上从 Docker 容器读取/写入主机文件

Nginx 重定向到错误的虚拟主机

nginx - nginx 位置和 proxy_pass 问题