You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CSV导入PostgreSQL Docker容器?解决文件不存在报错

解决Docker Postgres容器导入CSV时「No such file or directory」错误

错误原因

你执行的\COPY是psql的元命令,这个命令会让Postgres服务器端尝试读取指定路径的文件。但你的CSV文件在本地主机的/Users/…/目录下,Docker容器拥有独立的文件系统,无法直接访问主机的文件路径,因此报错。

解决方案

方案1:挂载本地文件到容器

修改docker-compose.yml,给db服务添加卷挂载,把本地CSV所在目录映射到容器内部(比如/tmp):

version: '3.8'
services:
  db:
    image: postgres:13.2-alpine
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: <>
      POSTGRES_PASSWORD: <>
      POSTGRES_DB: <>
    volumes:
      - /Users/…/:/tmp/  # 本地目录挂载到容器/tmp

重启容器后,执行\COPY时使用容器内的路径:

\COPY rams(ram) FROM '/tmp/rams.csv' WITH (FORMAT CSV) HEADER;

方案2:通过Node/Slonik客户端导入

不要使用psql的\COPY元命令,改用Slonik的copyFrom函数,让Node客户端读取本地文件并发送给Postgres服务器:

const { createPool } = require('slonik');
const fs = require('fs');
const path = require('path');

async function importCsv() {
  const pool = createPool('postgres://<POSTGRES_USER>:<POSTGRES_PASSWORD>@db:5432/<POSTGRES_DB>');
  
  const csvStream = fs.createReadStream(path.resolve('/Users/…/rams.csv'));
  
  await pool.copyFrom(
    'rams(ram)',
    csvStream,
    {
      format: 'csv',
      header: true,
    }
  );
  
  await pool.end();
}

importCsv();

这种方式无需挂载文件,直接通过客户端传输数据。

方案3:手动复制文件到容器

如果不想修改docker-compose.yml,可以用docker cp命令把文件复制到容器内部:

# 替换<容器名或ID>为你的Postgres容器标识
docker cp /Users/…/rams.csv <容器名或ID>:/tmp/rams.csv

然后进入容器的psql终端,执行:

\COPY rams(ram) FROM '/tmp/rams.csv' WITH (FORMAT CSV) HEADER;

注意事项

  • 确保容器内的文件路径对Postgres用户(默认是postgres)有读取权限
  • 使用Slonik时,确认依赖已正确安装,代码中的数据库连接字符串需替换为实际配置

内容的提问来源于stack exchange,提问作者Newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:15:39