如何从 Github Codespaces 连接到 Postgres

Posted

技术标签:

【中文标题】如何从 Github Codespaces 连接到 Postgres【英文标题】:How to connect to Postgres from Github Codespaces 【发布时间】:2021-02-18 13:54:51 【问题描述】:

我正在试验 GitHub Codespaces,尝试使用 Node 和 Postgres 启动应用程序。

我选择了以下选项:

产生了以下devcontainer.json

// Update the VARIANT arg in docker-compose.yml to pick a Node.js version: 10, 12, 14 

    "name": "Node.js & PostgreSQL",
    "dockerComposeFile": "docker-compose.yml",
    "service": "app",
    "workspaceFolder": "/workspace",

    // Set *default* container specific settings.json values on container create.
    "settings":  
        "terminal.integrated.shell.linux": "/bin/bash",
        "sqltools.connections": [
            "name": "Container database",
            "driver": "PostgreSQL",
            "previewLimit": 50,
            "server": "localhost",
            "port": 5432,
            "database": "postgres",
            "username": "postgres",
            "password": "postgres"
        ]
    ,

    // Add the IDs of extensions you want installed when the container is created.
    "extensions": [
        "dbaeumer.vscode-eslint",
        "mtxr.sqltools",
        "mtxr.sqltools-driver-pg"
    ]

    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [3000, 5432],

    // Use 'postCreateCommand' to run commands after the container is created.
    // "postCreateCommand": "yarn install",

    // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
    // "remoteUser": "node"


docker-compose.yml:

version: '3'

services:
  app:
    build: 
      context: .
      dockerfile: Dockerfile
      args:
        # [Choice] Node.js version: 14, 12, 10
        VARIANT: 14
        # On Linux, you may need to update USER_UID and USER_GID below if not your local UID is not 1000.
        USER_UID: 1000
        USER_GID: 1000

    volumes:
      - ..:/workspace:cached
      
    # Overrides default command so things don't shut down after the process ends.
    command: sleep infinity

    # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
    network_mode: service:db

    # Uncomment the next line to use a non-root user for all processes.
    # user: node

    # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. 
    # (Adding the "ports" property to this file will not forward from a Codespace.)

  db:
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: postgres

    # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward MongoDB locally.
    # (Adding the "ports" property to this file will not forward from a Codespace.)

volumes:
  postgres-data:

我的package.json如下:


  "dependencies": 
    "pg": "^8.4.2"
  ,
  "scripts": 
    "start": "node index.js"
  

而我的index.js 是这样的:

const  Pool  = require("pg")

const db = new Pool()

db.query(`CREATE TABLE IF NOT EXISTS testing(id SERIAL PRIMARY KEY);`)

运行yarn start 会产生以下错误:

codespace ➜ ~/workspace/codespace-demo (main ✗) $ yarn start
yarn run v1.17.3
warning package.json: No license field
$ node index.js
(node:1037) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:5432
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
(node:1037) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:1037) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Done in 0.11s.

这让我相信 Postgres 实例没有在代码空间内启动和运行。

我尝试取消注释有关转发端口的这一行:

"forwardPorts": [3000, 5432]

但没有运气。

我可能缺少一些关于 Docker 部件如何适合在这里播放的见解,但如果有人能指出我正确的方向,我会很高兴!

【问题讨论】:

可能是因为数据库服务尚未运行。你检查了吗? 我想这就是原因,但不确定如何从代码空间中启动它。你知道是否有标准的启动方式吗? 【参考方案1】:

我可以通过两点来解决这个问题。

    仅仅添加一个.devcontainer 和里面的文件是不够的。您需要提交更改、推送它们、删除代码空间,然后创建一个新的以反映更改。

    .devcontainer/docker-compose.yml 内部,我已将network_mode: host 行添加到db 服务。根据这个帖子,这个要求很快就会被删除,但现在它是必需的:https://github.community/t/cant-connect-to-postgres/142655/2?u=andyweiss1982

【讨论】:

以上是关于如何从 Github Codespaces 连接到 Postgres的主要内容,如果未能解决你的问题,请参考以下文章

GitHub Codespaces 的配置

GitHub Codespaces 的配置

Github CodeSpaces 使用及定制化

如何将现有的 Android Studio 项目连接到现有的 Github 存储库

为啥从 powershell 命令行连接到 github 时出错?

从 Terraform 云功能连接到 Enterprise GitHub