摘要
我正在使用Prisma (ORM)运行一个Sveltkit (JS )应用程序,它连接到PlanetScale (MySQL云数据库),没有问题。当我在docker中运行它时,应用程序将安装并运行,但无法连接到PlanetScale。如何允许Docker连接到PlanetScale?
错误
无法获得错误无效的
prisma.category.findMany()调用:无法到达aws-eu-west-2.connect.psdb.cloud3306的数据库服务器,请确保数据库服务器在aws-eu-west-2.connect.psdb.cloud3306上运行。
我已经确认了码头可以连接到互联网,但只是有困难连接到PlanetScale数据库。
代码
MySQL连接URI
密码已显示,但在我的.env文件中是正确的
DATABASE_URL='mysql://7m9rl9ecwydgs7d2oobp:********@aws-eu-west-2.connect.psdb.cloud/blog-database?sslaccept=strict'普里斯马
schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["referentialIntegrity"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
referentialIntegrity = "prisma"
}prisma.ts
辅助函数
import { PrismaClient, type PrismaPromise, type Category } from '@prisma/client'
const prisma = new PrismaClient()
export function findAllCategory(): Promise<Array<Category>> {
return prisma.category.findMany()
}Docker
DockerFile
FROM node:18-alpine3.15 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npx prisma generate
RUN npm run build && npm prune --production
FROM node:18-alpine3.15
USER node:node
WORKDIR /app
COPY --from=builder --chown=node:node /app/build ./build
COPY --from=builder --chown=node:node /app/node_modules ./node_modules
COPY --chown=node:node prisma .
COPY --chown=node:node package.json .
COPY --chown=node:node .env .
ENV PORT 5050
EXPOSE 5050
CMD ["node", "build"]码头命令
docker build . -t sveltekit:alpine
docker run -d -p 5050:5050 --name sveltekit-app sveltekit:alpineDocker运行时没有问题,但在转到http://localhost:5050时会显示错误
更新
我已经按照建议将环境变量移到了docker命令中。
我尝试了以下操作,但是错误仍然是一样的。
环境
我还将环境变量更改为:
DATABASE_URL='mysql://7m9rl9ecwydgs7d2oobp:pscale_pw_6KmIc1RUngdwn3sURKzxfDe3Oo7GM0NFeoATFxxNSAG@aws-eu-west-2.connect.psdb.cloud/blog-database?sslaccept=strict&connect_timeout=300'正如其他条款所建议的。
Dockerfile
我还进行了更新,以包含所有文件和相同的ca-certificate.crt,以检查是否所有环境都是相同的,并提高了版本,因为一些源有16的问题:
FROM node:17-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
RUN npm i mysql
COPY . .
RUN npx prisma generate
RUN npm run build
FROM node:17-alpine
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/build ./build
COPY package.json .
COPY prisma ./prisma
COPY . .
COPY ca-certificates.crt /etc/ssl/certs/
EXPOSE 3000
ENTRYPOINT ["node", "build"]从Docker运行MySQL CLI
根据我从这篇文章中收到的评论,我将mysql和mysql安装在我的对接箱上。
mysql -h aws-eu-west-2.connect.psdb.cloud -u 7m9rl9ecwydgs7d2oobp -p************* --ssl-ca=
/etc/ssl/cert.pem下面的命令成功运行,并且我能够成功地访问我的PlanetScale数据库。然而,prisma仍然抛出了错误。--它们都使用相同的URI和端口.
解决办法
在刷新多次之后,我能够加载页面,但是它是非常断断续续的,再次刷新会再次导致错误。当我不使用码头时,我没有这个问题。
发布于 2022-10-01 15:27:29
经过长时间的搜索,我找到了一个包含一些解决方案的github问题页。
将我的停靠文件更新到节点:16.15-阿尔卑斯(与我的Ubuntu子系统完全相同的节点版本),并将其与以前尝试的修复结合起来,将'connection_timeout=300'添加到my中,解决了这个问题,并提出了一些注意事项。
Dockerfile
FROM node:16.15-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npx prisma generate
RUN npm run build
FROM node:16.15-alpine
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/build ./build
COPY package.json .
COPY prisma ./prisma
COPY .env /app/.env
EXPOSE 3000
ENTRYPOINT ["node", "build"].env
DATABASE_URL='mysql://7m9rl9ecwydgs7d2oobp:pscale_pw_6KmIc1RUngdwn3sURKzxfDe3Oo7GM0NFeoATFxxNSAG@aws-eu-west-2.connect.psdb.cloud/blog-database?sslaccept=strict&connect_timeout=300'注意事项
Prisma在启动码头后的初始负载上失败,但刷新解决了这一问题。第一次重新加载某些页面也会导致此问题,但在此页面加载之后,即使切换到匿名以删除缓存,也是可靠的。
对于我的解决方案来说,这是一个足够的解决办法,但如果有更可靠的解决方案,我欢迎进一步的答案。
https://stackoverflow.com/questions/73766815
复制相似问题