我是 Postgres 的新手。
我更新了我使用的 Dockerfile 并在其上成功安装了 Postgresql。 (我的镜像运行 Ubuntu 16.04,我使用的是 Postgres 9.6。)
一切正常,直到我尝试使用 docker-compose 将数据库移动到 Volume (这是在使用 cp 复制容器文件夹之后) -R/var/lib/postgresql/somevolume/.)
问题是 Postgres 一直在崩溃,正如 supervisord 所见证的那样:
2017-07-26 18:55:38,346 INFO exited: postgresql (exit status 1; not expected)
2017-07-26 18:55:39,355 INFO spawned: 'postgresql' with pid 195
2017-07-26 18:55:40,430 INFO success: postgresql entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-07-26 18:55:40,763 INFO exited: postgresql (exit status 1; not expected)
2017-07-26 18:55:41,767 INFO spawned: 'postgresql' with pid 197
2017-07-26 18:55:42,841 INFO success: postgresql entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-07-26 18:55:43,179 INFO exited: postgresql (exit status 1; not expected)
(and so on…)
我不清楚发生了什么,因为 /var/log/postgresql 仍然为空。
我怀疑这与用户有关。如果我将容器内的数据文件夹和我制作的副本与卷进行比较,唯一的区别是原件属于 postgres 而副本属于 root.
我尝试在副本上运行 chown -R postgres:postgres。操作已成功执行,但 postmaster.pid 仍归 root 所有,我认为这将是问题所在。
postmaster.id 归 postgres 所有?root 来运行 postgres?欢迎任何提示。
编辑:链接到 the Dockerfile和 docker-compose.xml .
最佳答案
我会回答我自己的问题:
让事情变得更复杂的是我没有收到任何具体的错误消息。
为了改变这一点,我禁用了 supervisord 中的 [program:postgresql] 部分,而是从命令行手动启动 postgres(感谢 Miguel Marques 让我走上了正确的轨道他的评论。)
然后我终于得到了一些有用的错误信息:
2017-08-02 08:27:09.134 UTC [37] LOG: could not open temporary statistics file "/var/run/postgresql/9.6-main.pg_stat_tmp/global.tmp": No such file or directory
我用这个修复了上面的错误,最终将它们添加到我的 Dockerfile:
mkdir -p /var/run/postgresql/9.6-main.pg_stat_tmp
chown postgres.postgres /var/run/postgresql/9.6-main.pg_stat_tmp -R
(感谢 this guy 的修复。)
为了使数据永久化,我还必须这样做,以便 postgres 可以访问该卷:
mkdir -p /var/lib/postgresql/9.6/main
chmod 700 /var/lib/postgresql/9.6/main
我还使用了initdb来初始化数据目录。谨防!这将删除在该文件夹中找到的所有数据。像这样:
rm -R /var/lib/postgresql/9.6/main/*
ls /var/lib/postgresql/9.6/main/
/usr/lib/postgresql/9.6/bin/initdb -D /var/lib/postgresql/9.6/main
经过以上步骤,我终于可以正常运行 postgres 了。我使用这个命令来运行它并从命令行进行测试:
su postgres
/usr/lib/postgresql/9.6/bin/postgres -D /var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf # as per the Docker docs
为了测试,我让它一直运行,然后从另一个提示符检查一切运行正常:
su postgres
psql
CREATE TABLE cities ( name varchar(80), location point );
INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
select * from cities; # repeat this command after restarting the container to check that the data does persist
...确保重新启动容器并再次测试以检查数据是否持续存在。
然后最后恢复了 supervisord 中的 [program:postgresql] 部分,重建了镜像并重新启动了容器,确保一切运行良好(特别是 supervisord:tail/var/log/supervisor/supervisord.log),它确实做到了。
(我在 supervisord.conf 中使用的命令也是 /usr/lib/postgresql/9.6/bin/postgres -D/var/lib/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf,根据 this Docker article 和其他 postgres+supervisord 示例。其他选项将使用 pg_ctl 或 init.d 脚本,但我不清楚为什么/何时会使用这些脚本。)
我花了很多时间在这上面。希望详细的答案能对以后的人有所帮助。
P.S.:我最终确实制作了一个关于我的问题的最小示例。如果这可以帮助任何人,他们是:Dockerfile , supervisord.conf和 docker-compose.yml .
关于postgresql - Postgres 与 Docker : Postgres fails to load when persisting data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333492/
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom
我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户...8)错误:test_the_truth(用户测试):ActiveRecord::StatementInvalid:PGError:ERROR:关系“技术人员”不存在:从“技术人员”中删除...从本质上讲,标准框架不承认Technicians和Users表(或PostgreSQL称它们为“关系”)不存在,事实上,应该别名为Accounts。有什么想法吗?我对RoR比较陌生,不知道如何解决这个问题而又不完全删除STI。 最佳答案 原来问题是由于存在:./te
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat