2017-10-20 34 views
1

我想將數據從CSV文件加載到Docker中的PostgreSQL數據庫中。 我運行:如何設置將數據從CSV文件加載到Docker容器中的PostgreSQL數據庫的路徑?

docker exec -ti my project_db_1 psql -U postgres 

然後我選擇我的數據庫:

\c myDatabase 

現在,我嘗試從myfile.csv這是在Django項目的主目錄爲backend_data表加載數據:

\copy backend_data (t, sth1, sth2) FROM 'myfile.csv' CSV HEADER; 

但是我得到的錯誤:

myfile.csv: No such file or directory 

在我看來,我嘗試了所有可能的路徑,沒有任何工作。任何想法如何解決它?這是我的搬運工,compose.yml:

version: '3' 

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    django: 
    build: . 
    command: python3 manage.py runserver 0.0.0.0:8000 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 
+0

哪個容器是'myfile.csv' in,'django'或'db'?你要進入哪個容器? 'django'或'db'? – Alasdair

+0

@Alasdair'myfile.csv'在主目錄中,其中也是'docker-compose.yml'和'Dockerfile'的Django項目。我執行'\ copy backend_data(t,sth1,sth2)FROM'myfile.csv'CSV HEADER;'in'project_db_1''。 – wahtdbogh

+0

您沒有爲'db'容器裝載任何卷,文件'myfile.csv'不在'db'容器中,並且您正在該容器中運行該命令。在docker-compose.yml'卷中添加可能的解決方案: - 「」' –

回答

2

最簡單的方法是將一個目錄掛載到Postgres容器,放置文件到安裝目錄,並引用它。

我們實際上正在安裝pgdata目錄,以確保即使重新創建postgres泊塢窗容器,postgres數據仍然存在。所以,我的例子也將使用pgdata

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    volumes: 
    volumes: 
     - "<path_to_local_pgdata>:/var/lib/postgresql/data/pgdata" 

myfile.csv<path_to_local_pgdata>(相對於包含配置或絕對路徑的目錄)。複製命令,然後看起來是這樣的:

\copy backend_data (t, sth1, sth2) FROM '/var/lib/postgresql/data/pgdata/myfile.csv' CSV HEADER; 
+0

並且'local_pgdata'必須位於主目錄中? – wahtdbogh

+0

如果它是一個相對路徑,那麼'local_pgdata'必須與主目錄相對,是的。 – Risadinha

+0

'docker-compose.yml'應該是' - 「。/ local_pgdata:/ var/lib/postgresql/data/pgdata「'謝謝你的幫助 – wahtdbogh

0

你需要安裝myfile.csv的路徑在db容器,如果你正在運行在該容器中的命令。

您可能已將該文件僅安裝在django服務中。

可能docker-compose.yml

version: '3' 

services: 
    db: 
    image: postgres 
    environment: 
     POSTGRES_USER: myuser 
     POSTGRES_PASSWORD: mypassword 
    volumes: 
     - <path_to_csv_in_local>:<path_of_csv_in_db_container> 
    django: 
    build: . 
    command: python3 manage.py runserver 0.0.0.0:8000 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    depends_on: 
     - db 

您尚未創建db的坐騎。這會在您關閉數據庫容器後發生致命的行爲(您將丟失所有數據)。 postgresql集裝箱數據存儲在/var/lib/postgresql/data。您需要將此路徑安裝到本地系統,以便即使容器關閉也可以維護數據。

volumes: 
    - <path_of_db_in_local_system>:/var/lib/postgresql/data 
+0

如何檢查我的'path_of_db_in_local_system'? – wahtdbogh

+0

你可以將它設置爲任何你想要的東西(並且可以被docker訪問服務)..它將成爲存儲在你的容器中的任何數據(基本上是django應用程序在postgres上執行的任何基於模型的操作)將複製到本地系統的路徑,這樣即使容器由於 –

+0

好的,但是我應該有兩個卷:和':/ var/lib/postgresql/data'或者它是相同的? – wahtdbogh

相關問題