当前位置: 首页 > 知识库问答 >
问题:

无法通过Docker连接到云SQL代理-错误:连接ENOENT

国盛
2023-03-14

我似乎无法使用Docker容器连接到CloudSQL。

首先,这里是我的文件路径:https://imgur.com/a/Nmx41o6

Dockerfile.dev:


FROM node:14-slim

WORKDIR /usr/src/app


COPY package*.json ./


RUN npm install


COPY . ./

Dockerfile.sql

RUN mkdir /cloudsql
WORKDIR /usr/src/app


COPY package*.json ./

RUN npm install


COPY ./cloud_sql_proxy ./
COPY ./service_acct.json ./

version: '3.8'
services: 
    cloud-sql-proxy:
        build: 
            context: .
            dockerfile: DockerFile.sql
        volumes: 
            - /cloudsql:/cloudsql
            - /service_acct.json:/app/service_acct.json
        command: ./cloud_sql_proxy -dir=/cloudsql -instances=test-game-199281:us-east1:testgame -credential_file=/app/service_acct.json
      
    app:
        build: 
            context: .
            dockerfile: DockerFile.dev
        env_file: 
            - ./.env
        volumes: 
            # since we copied root into host in dockerfile, we can map the whole directory with app.
             - "./src:/app/src"
        
        ports: 
            - "5000:5001"
        command: sh -c "npm run dev"

我的节点索引.js文件。我不认为有什么问题,也许我输入了错误的连接字符串格式?据我所知,密码和用户是正确的。

const express = require('express');
const { Pool, Client } = require('pg')
const app = express();
require('dotenv').config({path:'../.env'})

const pool = new Pool({
    user: 'postgres',
    host: '/cloudsql/test-game-199281:us-east1:testgame',

    database: 'TestDB',
    password: '********',
    port: 5432
    
  })

  
app.get('/', (req, res) => {
    pool.connect(function(err, client, done) {
        if (err) {
            console.log("not able to get connection " + err);
            res.status(400).send(err);
            return
        }
        client.query("SELECT * FROM company", [1], (err, result) =>{
            done();
            if (err) {
                console.log(err);
                res.status(400).send(err);
            }
            res.status(200).send(result.rows);
        });
    });

});

我得到的错误:

Hello world listening on port 5001

app_1 | Error: connect ENOENT /cloudsql/test-game-199281:us-east1:testgame

/.s.PGSQL.5432

app_1 | at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) {

app_1 | errno: -2,

app_1 | code: 'ENOENT',

app_1 | syscall: 'connect',

app_1 | address: '/cloudsql/test-game-199281:us-east1:testgame

/.s.PGSQL.5432'

app_1 | }

解决:我切换到TCP。拧入unix插座。这太令人困惑了。

共有3个答案

杭永安
2023-03-14

< code > e not 错误表示连接器实用程序找不到连接到数据库的主机。这里有一个很好的答案进一步解释了它。

docker-compose文件上,云SQL代理正在通过TCP监听,但您的代码正在尝试通过Unix套接字连接。您的代码无法连接到主机,因为套接字不存在。

解决方案是配置您的代理以创建和监听Unix Socket。将命令更改为:

/cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME -dir=/cloudsql -credential_file=/tmp/keys/keyfile.json

无需公开任何端口即可通过 Unix 套接字进行连接。我还建议使用像上面链接中或pg-pool指定的配置对象而不是数据库URL来构建池连接,以避免无法使用连接字符串URL连接到Unix套接字可能问题。

江宏放
2023-03-14

在不同Docker之间连接时,您可以尝试通过服务名称云sql代理:5432而不是本地主机:5432进行连接。

每个docker都是一个隔离的网络,因此您不能使用localhost,因为localhost将引用docker容器自己的本地网络。

危砚
2023-03-14

您已经指示云SQL身份验证代理使用此标志监听< code > 0 . 0 . 0 . 0:5432 -instances = test-game-199281:us-east 1:test game = TCP:0 . 0 . 0 . 0:5432 。

但是,您已经指示您的应用程序连接到< code>/cloudsql/

你需要选择一个,并确保你的应用程序和代理之间保持一致。

如果使用 TCP,则必须将容器中的端口映射到计算机上的端口(或 Docker-compose 网络中应用可以访问它的某个位置)。您必须更新您的应用程序才能在127.0.0.1(或其docker IP在网络中的任何)上进行连接。您可以在此处查看有关 Docker 撰写网络的更多信息。

如果您使用Unix域套接字,您需要宗卷共享包含套接字的文件夹,以便两个应用程序都可以访问它。因此,如果它在< code>/cloudsql中,您将需要在代理容器和应用程序容器之间共享< code>/cloudsql。你可以在这里查看更多的docker-compose卷。

云 SQL 的“管理数据库连接”页面提供了使用 TCP 和 Unix 域套接字进行连接的示例。

 类似资料:
  • 我正在尝试为我的kubernetes项目使用。 我遵循仙丹指南和凤凰指南。在Connect to your Cloud SQL实例中,该指南指出,运行“cloud_sql_proxy-dir=/tmp/cloudsql”和“psql-h/tmp/cloudsql/[CONNECTION-NAME]-u postgres”将打开代理。 所以我尝试用下面的这些命令创建一个新的目录。 然后我尝试连接云s

  • 我有一个使用LocalDB并在Windows PC上运行良好的应用程序,但是我试图通过我的mac运行它......我正在努力将应用程序连接到位于docker上的mySQL服务器。我一直在遵循其他指南,例如(https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver1

  • 每次我试图通过SSMS连接到azure服务器时,都会出现以下错误。已在服务器防火墙中列出IP客户端地址,但仍然不起作用。 微软 SQL 服务器,错误: 53 我正在使用Microsoft Imagine订阅下的azure学生许可证,这有问题吗? 附笔。: > 已尝试使用此 https://learn.microsoft.com/en-us/sql/database-engine/configure

  • 问题内容: 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以通过使用本地计算机上的curl来访问Kibana和Elastic search 我得到以下回应 var hashRoute =’/ app / kibana’; var defaultRoute =’/ app / kibana’; var hash = window.location.hash;

  • 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以使用 我得到以下回应 var hashRoute='/app/kibana'; var defaultRoute='/app/kibana'; var hash=window.location.hash; if(hash.length){window.location=hashRoute hash;}其他{wi

  • 尝试使用Docker容器将Kibana连接到ES时出错: kibana-product-624|{"type":"log","@time戳":"2018-05-25T14:56:36Z","tags":["警告","elasticsearch","admin"],"pid": 1,"消息":"无法恢复连接:超文本传输协议://elasticsearch: 9200/"}kibana-product