47

给定一个带有 SQL 插入的文件:

INSERT INTO countries (id, country_code, name)
VALUES
    (1, 'AF', 'Afghanistan'),
    (2, 'AL', 'Albania');

我想通过在docker run运行 postgres 的容器上使用命令来运行该文件。

我试过这个:

docker run -e domain="192.168.99.100" pg /bin/bash -c "psql -d whiteboard_api -a -f inserts_into_countries_table.sql"
psql: could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

你可以看到我的图像是 pg:

capistrano:whiteboard_v2 jzollars$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b500bec9210        bbb                 "/usr/bin/supervisord"   4 weeks ago         Up 4 weeks          0.0.0.0:80->80/tcp       distracted_raman
c1e88f2695f5        wh                  "/usr/bin/supervisord"   4 weeks ago         Up 4 weeks          0.0.0.0:3000->3000/tcp   high_einstein
7e383e99bdc3        pg                  "/usr/lib/postgresql/"   4 weeks ago         Up 4 weeks          0.0.0.0:5432->5432/tcp   pg_test

如何加载此文件并使用 docker 容器在 docker 容器中运行它docker run

4

4 回答 4

80

要对正在运行的容器执行命令,请使用docker exec

要将文件(例如:dump.sql)复制到容器中,请使用 docker cp

所以你的方法可能看起来像这样:

docker cp ./dump.sql pg_test:/docker-entrypoint-initdb.d/dump.sql
docker exec -u postgres pg_test psql postgres postgres -f docker-entrypoint-initdb.d/dump.sql

这是通用形式:

docker cp ./localfile.sql containername:/container/path/file.sql
docker exec -u postgresuser containername psql dbname postgresuser -f /container/path/file.sql

请注意,如果您需要在每次运行数据库时为其播种,则该文件夹/docker-entrypoint-initdb.d/确实具有特殊意义,如果您使用的是 官方 postgres 映像

于 2016-01-09T02:14:03.277 回答
54

您可以通过一个衬垫对正在运行的 postgres 容器运行 sql 命令文件

cat ./query.sql | docker exec -i <container-name> psql -U <user> -d <database>

无需将文件从主机复制到容器。

于 2020-05-18T21:43:29.917 回答
5

使用 PostgreSQL 的官方 Docker 映像,code_monk 的答案对我不起作用。我得出了这个解决方案:

docker exec -it <container-name> psql -U <DB_USER> -d <DB_NAME> -f /file.sql
于 2018-11-09T07:32:59.410 回答
1
#!/bin/bash
set -e

FUN_SQL2="
CREATE OR REPLACE FUNCTION insert_event(text)
  RETURNS integer AS
\\\\$BODY\\\\$
DECLARE ret INTEGER;
begin
select $1 into ret;
RETURN ret;

end;
\\\\$BODY\\\\$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
"

# add function to DB
docker exec -it db_container sh -c "psql -U postgres -d db_name -c \"$FUN_SQL2\" ";
于 2020-03-12T06:52:21.853 回答