【问题标题】:How can I deploy a graphql API with docker-compose in azure如何在 azure 中使用 docker-compose 部署 graphql API
【发布时间】:2021-03-04 17:56:28
【问题描述】:

我在尝试将 graphql API 部署到 Azure Web 应用程序时遇到问题(我不知道这是否是正确的地方,但这是我的情况)

我的期望

我想使用带有 azure-container-registry 的 docker-compose 文件部署 graphql API。我使用 docker 进行本地开发,一切正常。在 docker-compose 文件中,我定义了本地环境变量,在我的 node.js API 中,我使用 process.env.{variable_name} 引用了这个变量

我的问题

在生产中,当我尝试访问我当前部署的应用程序链接(例如https://myapp.azurewebsites.net/graphql)时,我得到了一个空白页面(没有可见的错误日志)

这是我的 graphql API 堆栈:Apollo Server、Nodejs、Docker compose(我使用了 apollo-server-express)

我尝试了什么

我使用 Azure 管道来部署我的应用程序的前端存储库并配置了一个 GitHub 操作。所以我决定在我的后端存储库中使用相同的逻辑。

我已经使用 Atlas 部署了我的 mongodb。

我将 docker-compose-prod.yml 变量放在 ${ } 符号之间,因为我想这对于 azure 管道检测我将放置变量的位置是必要的

这就是它的样子。


# Docker
# Build and push an image to Azure Container Registry
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- main

resources:
- repo: self

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <.....>
  imageRepository: 'myimagereposity'
  containerRegistry: 'mycontainerregistry.azurecr.io'
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile.dev'
  tag: '$(Build.BuildId)'
  dockerComposeFile: '$(Build.SourcesDirectory)/docker-compose-prod.yml'
  projectName: $(Build.Repository.Name)
  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: DockerCompose@0
      inputs:
        containerregistrytype: 'Azure Container Registry'
        azureSubscription: 'Suscripcion developer 1(id-subs)'
        azureContainerRegistry: '{"loginServer":"mycontainerregistry.azurecr.io", "id" : "/subscriptions/id-subs/resourceGroups/proyecto-final/providers/Microsoft.ContainerRegistry/registries/mycontainername"}'
        dockerComposeFile: '**/docker-compose-prod.yml'
        dockerComposeFileArgs: |
          DATABASE_URL=mongodb+srv://mydb-user:$(dbpassword)@cluster0.defvz.mongodb.net/$(dbname)?retryWrites=true&w=majority
          AWS_ACCESS_ID=$(AWS_ACCESS_ID)
          AWS_SECRET_KEY=$(AWS_SECRET_KEY)
          AWS_REGION=$(AWS_REGION)
          S3_BUCKET_NAME=$(S3_BUCKET_NAME)
          GOOGLE_APPLICATION_CREDENTIALS=$(GOOGLE_APPLICATION_CREDENTIALS)
        action: 'Build services'

这是我的 Dockerfile

FROM node:12-alpine 

EXPOSE 8080

WORKDIR /usr/src/app 

COPY package*.json ./

RUN npm install --silent 

COPY . .

CMD [ "npm", "run", "debug" ]

这是我的 docker-compose-prod.yml


version: '3.7'

services:
  api:
    container_name: 'saaga-api'
    restart: 'always'
    build:
      context: .
      dockerfile: 'Dockerfile.prod'
    volumes:
      # - /usr/src/app/node_modules
      - '.:/usr/src/app'
    environment:
      NODE_ENV: production
      ORIGIN: 'https://myapp.azurewebsites.net'
      PORT: 8080
      DATABASE_URL: ${DATABASE_URL}
      AWS_ACCESS_ID: ${AWS_ACCESS_ID}
      AWS_SECRET_KEY: ${AWS_SECRET_KEY}
      AWS_REGION: ${AWS_REGION}
      S3_BUCKET_NAME: ${S3_BUCKET_NAME}
      GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS}
    ports:
      - 8080:8080
      - 9229:9229
    links:
      - db
  db:
    container_name: 'mongodb'
    image: 'mongo'
    ports:
      - 27017:27017

有人知道我缺少什么或我做错了什么吗?该应用在本地环境中运行良好,问题仅在生产中。

【问题讨论】:

  • 可以分享web app的日志吗?
  • 502 - Web 服务器在充当网关或代理服务器时收到无效响应。您要查找的页面有问题,无法显示。当 Web 服务器(作为网关或代理)联系上游内容服务器时,它收到了来自内容服务器的无效响应。

标签: node.js azure docker docker-compose graphql


【解决方案1】:

正如我所见,您为 API 应用程序公开了端口 8080 和 9229,但 Azure Web 应用程序只能将一个端口从 80 或 443 公开到外部。所以如果不使用 80 和 443 端口,则需要将环境变量WEBSITES_PORT 设置为要对外暴露的端口。

【讨论】:

  • 这似乎是问题所在,我将尝试使用不同的端口。也许这可以解决问题
  • @Roberto 如果有任何消息,请告诉我。
  • 我终于做到了!我更改了端口,但我也再次配置了环境变量。我再次进行了部署,并且可以正常工作。我不知道使用 azure 容器是否有问题,但是当我创建另一个 Web 应用程序时,我选择了源代码而不是 Linux 容器。感谢您的帮助!
猜你喜欢
  • 2021-07-11
  • 2020-04-09
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多