因官网提供的 postgresql 镜像对 linux 精简的太厉害,根底的 yum、telnet、ping 都没有了,很多操作不不便,所以这几天在尝试本人制作一个镜像,以后思路是在根底镜像 centos 上自定义装置了 postgresql 库,而后 commit
1. 问题景象
commit 提交镜像后,通过镜像中的 shell 脚本启动数据库后,镜像状态未启动胜利,报错内容:
Unable to find image 'mypg_02:latest' locally
Trying to pull repository docker.io/library/mypg_02 ...
/usr/bin/docker-current: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on ip:53: server misbehaving.
See '/usr/bin/docker-current run --help'.
启动脚本:
docker run -d --name mypg01 -p 5201:5432 --network network-bridge mypg_02 /root/dockerStart/start.sh
其中 start 脚本内容:
#!/bin/bash
su - postgres -c "/opt/pgdata/pg5432/scripts/startServer5432.sh"
2. 问题起因
先回顾下操作, 宿主机操作:
docker pull centos:7.4.1708 # 拉取镜像
docker run -d -v /root/docker_dirs/centos01:/opt/centos centos:7.4.1708 /bin/sh -c "while true; do echo hello world; sleep 60; done" # 运行 centos 镜像,centos 镜像如果命令是 /bin/bash,运行后会主动退出,因为容器没有检测到正在运行的过程
下载 PG 库的安装文件,并上传到宿主机的 /root/docker_dirs/centos01
容器内操作,装置 pg 库,root 用户执行如下命令:
cp /opt/centos/yum.repos.d/* . #配置 yum 源
yum install -y readline-devel gcc zlib-devel gcc automake autoconf libtool make bzip2 # 装置依赖包
cd /opt/
cp centos/postgresql-12.2.tar.bz2 .
tar -xvf postgresql-12.2.tar.bz2 # 解压文件
ln -s postgresql-12.2 postgresql
mkdir -p pgdata/pg5432
cd pgdata/pg5432
mkdir -p {data,backups,scripts,archive_wals}
cd /opt/postgresql
/opt/postgresql/configure --prefix=/opt/postgresql #编译、装置
make
make install
useradd postgres
cd /opt
chown -R postgres:postgres p*
postgres 用户用户执行如下命令
/opt/postgresql/bin/initdb -D /opt/pgdata/pg5432/data #初始化数据库
mkdir /opt/pgdata/pg5432/logs
/opt/postgresql/bin/pg_ctl -D /opt/pgdata/pg5432/data -l /opt/pgdata/pg5432/logs/startlogs.log start & #启动数据库验证
more /opt/pgdata/pg5432/scripts/startServer5432.sh # 新建启动文件
/opt/postgresql/bin/pg_ctl -D /opt/pgdata/pg5432/data -l /opt/pgdata/pg5432/logs/startlogs.log start &
root 用户用户执行如下命令
/root/dockerStart/start.sh # 创立启动脚本
#!/bin/bash
su - postgres -c "/opt/pgdata/pg5432/scripts/startServer5432.sh"
退出容器后在宿主机执行如下命令:
docker commit centos01 mypg_01 # 提交镜像
docker run -d --name mypg02 -p 5300:5432 --network network-bridge mypg_01 /root/dockerStart/start.sh #应用新的镜像启动容器,启动失败,且容器提留在 created 状态
报错如下:/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint mypg02 (f14f29f8eb010fc128873d022e5caa4abe59becca234588f682942acba4ad4a4): Bind for 0.0.0.0:5300 failed: port is already allocated.
容器状态:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb9f683c1307 mypg_01 "/root/dockerStart..." About a minute ago Created mypg02
集体了解是 自定义的命令是通过 后盾执行命令的形式启动 PG 库,在容器检测不到这个命令是否还在持续,所以容器并不会持续启动。commit 形式只是在根底镜像上装置了一些利用,所以启动还是须要用根底镜像的形式启动:
docker run -d --name mypg02 -p 5200:5432 --network network-bridge mypg_01 /bin/sh -c "while true; do echo hello world; sleep 60; done"
4、总结
commit 形式个别用于提交用户批改的内容,比方新公布的 jar 包,不适宜用于构建镜像。