【发布时间】: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