使用Docker部署服务时出现/etc/nginx/certs目录不存在错误求助
问题修复方案
报错open /etc/nginx/certs: no such file or directory的核心原因是nginx-proxy容器内缺少存储SSL证书的目录,同时你的docker-compose配置存在几处关键问题,和文件放在根目录无关,下面是具体修复步骤:
1. 给nginx-proxy添加必要的卷挂载
必须挂载本地目录到容器的/etc/nginx/certs,用来存储Let's Encrypt生成的证书;同时挂载vhost.d和html目录,用于自定义虚拟主机配置和默认页面。另外只需要映射80(HTTP)和443(HTTPS)端口,无需直接映射3000端口(反向代理会自动转发)。
修改后的nginx-proxy服务配置:
nginx-proxy: image: jwilder/nginx-proxy:alpine container_name: nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs:rw - ./vhost.d:/etc/nginx/vhost.d:rw - ./html:/usr/share/nginx/html:rw environment: - DEFAULT_HOST=default.local networks: - app-network restart: always
提前在docker-compose.yml所在目录创建所需目录并设置权限:
mkdir -p certs vhost.d html chmod 755 certs vhost.d html
2. 移除单独的dockergen服务
jwilder/nginx-proxy镜像已经内置了dockergen,单独运行dockergen容器会导致配置冲突,这也是引发模板错误的原因之一,直接删除整个dockergen服务块即可。
3. 修正Let's Encrypt Companion配置
确保它能正确访问证书存储卷,同时可以添加可选的测试环境参数(避免正式环境请求次数超限):
nginx-letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion container_name: nginx-letsencrypt volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs:rw networks: - app-network depends_on: - nginx-proxy environment: - NGINX_PROXY_CONTAINER=nginx-proxy # - ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory # 测试环境用,正式环境注释 restart: always
4. 修正API服务的环境变量错误
appenings-api中的LETSENCRYPT_EMAIL应该是你的邮箱地址,而非域名:
appenings-api: image: my-other-image-container-url container_name: appenings-api expose: - "3000" environment: - VIRTUAL_HOST=my-other-domain - LETSENCRYPT_HOST=my-other-domain - LETSENCRYPT_EMAIL=your-email@example.com networks: - app-network restart: always
完整修改后的docker-compose.yml
version: '3' services: nginx-proxy: image: jwilder/nginx-proxy:alpine container_name: nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs:rw - ./vhost.d:/etc/nginx/vhost.d:rw - ./html:/usr/share/nginx/html:rw environment: - DEFAULT_HOST=default.local networks: - app-network restart: always nginx-letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion container_name: nginx-letsencrypt volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs:rw networks: - app-network depends_on: - nginx-proxy environment: - NGINX_PROXY_CONTAINER=nginx-proxy restart: always appenings-api: image: my-other-image-container-url container_name: appenings-api expose: - "3000" environment: - VIRTUAL_HOST=my-other-domain - LETSENCRYPT_HOST=my-other-domain - LETSENCRYPT_EMAIL=your-email@example.com networks: - app-network restart: always appenings-web: image: my-image-container-url container_name: appenings-web expose: - "80" environment: - VIRTUAL_HOST=my-domain - LETSENCRYPT_HOST=my-domain - LETSENCRYPT_EMAIL=my-email networks: - app-network restart: always networks: app-network: driver: bridge
启动服务
执行以下命令启动所有服务:
docker-compose up -d
内容的提问来源于stack exchange,提问作者Daniel Gustafsson
相关产品推荐
相关产品推荐

