如何将 Docker 连接到 PlanetScale

2023-11-27

Summary

我正在使用 Prisma (ORM) 运行 Sveltkit(JS 框架)应用程序,它可以毫无问题地连接到 PlanetScale(MySQL 云数据库)。当我在 docker 中运行它时,应用程序会安装并运行,但无法连接到 PlanetScale。我如何允许 Docker 连接到 PlanetScale?

Error

获取失败,错误为无效prisma.category.findMany()调用: 无法访问数据库服务器aws-eu-west-2.connect.psdb.cloud:3306请确保您的数据库服务器正在运行aws-eu-west-2.connect.psdb.cloud:3306.

我已经确认了docker可以连接互联网但连接到 PlanetScale 数据库时遇到问题。

Code

MySQL 连接 URI

密码已加星号,但在我的中是正确的.env file

DATABASE_URL='mysql://7m9rl9ecwydgs7d2oobp:********@aws-eu-west-2.connect.psdb.cloud/blog-database?sslaccept=strict'

Prisma

模式棱镜

generator client {     
    provider = "prisma-client-js"
    previewFeatures = ["referentialIntegrity"]
}

datasource db {
    provider = "mysql"
    url = env("DATABASE_URL")
    referentialIntegrity = "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

Docker文件

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 命令

docker build . -t sveltekit:alpine
docker run -d -p 5050:5050 --name sveltekit-app sveltekit:alpine

Docker 运行没有问题,但访问 http://localhost:5050 时显示错误

Update

我已按照建议将环境变量移至 docker 命令中。

我已尝试以下操作,但错误仍然相同。

Env

我还将环境变量更改为:

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

根据我从这篇文章中收到的评论,我在我的 docker 盒子上安装了 mysql 和 mysql-client。

mysql -h aws-eu-west-2.connect.psdb.cloud -u 7m9rl9ecwydgs7d2oobp -p************* --ssl-ca=
/etc/ssl/cert.pem

以下命令成功运行,我能够成功访问我的 PlanetScale 数据库。然而 prisma 仍然抛出错误。它们都使用相同的 URI 和端口。

解决方法

多次刷新后,我能够加载页面,但是它非常间歇性,再次刷新将再次导致错误。当我不使用 docker 时,没有这个问题。


经过长时间的搜索,我发现了一个github问题页面其中包含一些解决方案。

将我的 docker 文件更新为节点:16.15-alpine(与我的 Ubuntu 子系统上的节点版本完全相同)并将其与之前尝试的修复结合起来添加“connection_timeout = 300”我的数据库 URL 解决了这个问题,但有一些警告。

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'

Caveats

Prisma 启动 docker 后初始加载失败,但刷新可以解决此问题。首次重新加载某些页面也会导致此问题,但此页面加载之后即使切换到隐身模式以删除缓存也是可靠的。

这对于我的解决方案来说已经足够了,但如果有更可靠的解决方案,我欢迎进一步的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Docker 连接到 PlanetScale 的相关文章

随机推荐