【问题标题】:Traefik: Level=error msg=“field not found, node: mywebsite” providerName=dockerTraefik:Level=error msg=“field not found, node: mywebsite” providerName=docker
【发布时间】:2020-10-22 00:34:19
【问题描述】:

我正在使用Gatsby 构建一个静态网站,并且我正在使用Nginx 来提供静态文件。

我还设置了Docker 用于将应用程序部署到生产环境,并使用Traefik 作为 Docker 容器中的反向代理。

Traefik 在不同的容器上运行,而Gatsby 应用程序在与Nginx 一起在不同的容器上运行。

但是,当我在生产环境中运行应用程序时,我收到了这个错误:

level=error msg="field not found, node: mywebsite" providerName=docker container=web-my-website

这是我的代码

Nginx 的默认配置文件

server {
  listen 3008;
  add_header Cache-Control no-cache;
  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
    expires -1;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

Dockerfile

# Set base image
FROM node:latest AS builder

# Set working directory
WORKDIR /app

# Copy package.json and install packages
COPY package.json .
RUN npm install

# Copy other project files and build
COPY . ./
RUN npm run build

# Set nginx image
FROM nginx:latest

# Nginx config
RUN rm -rf /etc/nginx/conf.d/default.conf
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

# Static build
COPY --from=builder /app/public /usr/share/nginx/html

# Set working directory
WORKDIR /usr/share/nginx/html

# Start Nginx server
CMD ["/bin/bash", "-c", "nginx -g \"daemon off;\""]

Gatsby 应用程序的 docker-compose.yml

version: "3"

services:
  web:
    image: my-website
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - "3004"
    labels:
      - traefik.enable=true
      - traefik.http.routers.mywebsite.rule=Host(`mywebsite.com`)
      - traefik.http.services.educollectwebsite.loadbalancer.server.port=3004
    restart: always
    volumes:
      - .:/app
networks:
  default:
    external:
      name: traefik-proxy

Traefik 的 docker-compose.yml

version: "3"

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.2
    # Enables the web UI and tells Traefik to listen to docker
    command:
      - --api.insecure=true
      - --entrypoints.web.address=:80
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
    ports:
      # The HTTP port
      - "88:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8088:8080"
    restart: always
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  default:
    external:
      name: traefik-proxy

我似乎无法弄清楚这里的问题所在。任何形式的帮助都将不胜感激。

【问题讨论】:

    标签: docker nginx docker-compose gatsby traefik


    【解决方案1】:

    在与我的直线经理合作了几个小时后,我终于能够解决这个问题。

    问题是我在 Nginx default.conf 文件中定义了端口 3008,然后在 Gatsby 应用程序的 docker-compose.yml 中定义了端口 3004文件。这不允许流量从 Traefik 反向代理进入应用程序。因为两个端口不同。

    解决方案 1

    只需在 Nginx default.confGatsby 应用程序的 docker-compose.yml 文件中定义 3008 的相同端口即可修复它:

    Nginx 的默认配置文件

    server {
      listen 3008;
      add_header Cache-Control no-cache;
      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
        expires -1;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
    

    Gatsby 应用程序的 docker-compose.yml

    version: "3"
    
    services:
      web:
        image: my-website
        build:
          context: .
          dockerfile: Dockerfile
        expose:
          - "3004"
        labels:
          - traefik.enable=true
          - traefik.http.routers.mywebsite.rule=Host(`mywebsite.com`)
          - traefik.http.services.educollectwebsite.loadbalancer.server.port=3008
        restart: always
        volumes:
          - .:/app
    networks:
      default:
        external:
          name: traefik-proxy
    

    解决方案 2:

    Nginx default.confGatsby 应用程序的 docker-compose.yml 文件中定义 Traefik 的默认端口,即端口 80 修复了它。这在部署静态应用程序时更可取,因为它可以帮助我为应用程序假设一个合理的默认值。

    Nginx 的默认配置文件

    server {
      listen 80;
      add_header Cache-Control no-cache;
      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
        expires -1;
      }
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
        root   /usr/share/nginx/html;
      }
    }
    

    Gatsby 应用程序的 docker-compose.yml

    version: "3"
    
    services:
      web:
        image: my-website
        build:
          context: .
          dockerfile: Dockerfile
        expose:
          - "80"
        labels:
          - traefik.enable=true
          - traefik.http.routers.mywebsite.rule=Host(`mywebsite.com`)
        restart: always
        volumes:
          - .:/app
    networks:
      default:
        external:
          name: traefik-proxy
    

    注意:使用与 Traefik 相同的端口,即应用程序中的 80 端口,会使对 Traefik 负载均衡器服务的需求无效。

    - traefik.http.services.educollectwebsite.loadbalancer.server.port=80
    

    就是这样。

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2018-11-19
      • 2023-03-15
      • 2011-06-03
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多