如何通过 docker 运行 运行 sql 插入文件?
How do I run a sql file of inserts through docker run?
给定一个包含 SQL 插入的文件:
INSERT INTO countries (id, country_code, name)
VALUES
(1, 'AF', 'Afghanistan'),
(2, 'AL', 'Albania');
我想在 运行ning postgres 容器上使用 docker run
命令来 运行 文件。
我试过这个:
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 run
加载此文件并将其 运行 放入 docker 容器中?
要针对 运行ning 容器执行命令,请使用 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/
会 have special significance, if you're using the offical postgres image
使用 PostgreSQL 的官方 Docker 图像, 对我不起作用。
我得出这个解决方案:
docker exec -it <container-name> psql -U <DB_USER> -d <DB_NAME> -f /file.sql
#!/bin/bash
set -e
FUN_SQL2="
CREATE OR REPLACE FUNCTION insert_event(text)
RETURNS integer AS
\\$BODY\\$
DECLARE ret INTEGER;
begin
select 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\" ";
您可以 运行 一个 sql 命令文件通过一个 liner
针对 运行ning postgres 容器
cat ./query.sql | docker exec -i <container-name> psql -U <user> -d <database>
无需将文件从主机复制到容器。
给定一个包含 SQL 插入的文件:
INSERT INTO countries (id, country_code, name)
VALUES
(1, 'AF', 'Afghanistan'),
(2, 'AL', 'Albania');
我想在 运行ning postgres 容器上使用 docker run
命令来 运行 文件。
我试过这个:
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 run
加载此文件并将其 运行 放入 docker 容器中?
要针对 运行ning 容器执行命令,请使用 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/
会 have special significance, if you're using the offical postgres image
使用 PostgreSQL 的官方 Docker 图像,
docker exec -it <container-name> psql -U <DB_USER> -d <DB_NAME> -f /file.sql
#!/bin/bash
set -e
FUN_SQL2="
CREATE OR REPLACE FUNCTION insert_event(text)
RETURNS integer AS
\\$BODY\\$
DECLARE ret INTEGER;
begin
select 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\" ";
您可以 运行 一个 sql 命令文件通过一个 liner
针对 运行ning postgres 容器cat ./query.sql | docker exec -i <container-name> psql -U <user> -d <database>
无需将文件从主机复制到容器。