我正在遵循此guide以非root用户身份运行容器。用户gpadmin
已在图像中创建。
但是,如果我运行以下命令,容器将立即退出:
root@dev01:~# docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --user gpadmin --name gpcentos-dev --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
adcaf577c0a589987b556824a3413c74381dfe4d9347467891cf47ac18b91743
root@dev01:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adcaf577c0a5 gpdb-postgres9.4/centos "/usr/sbin/sshd -D" 4 seconds ago Exited (1) 2 seconds ago gpcentos-dev
但是,当我跳过--user gpadmin
运行命令时,容器不会立即退出。
root@dev01:~# docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --name gpcentos-dev --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
24f00ec4e531168fb266e7f4616e5fa8f2829112132de211392a9040a0f52d5f
root@dev01:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24f00ec4e531 gpdb-postgres9.4/centos "/usr/sbin/sshd -D" 8 seconds ago Up 7 seconds 22/tcp, 0.0.0.0:5432->5432/tcp, 80/tcp, 0.0.0.0:28080->28080/tcp gpcentos-dev
据我了解,-i -t -d
应该使容器在后台运行。
编辑1:基于docker best practices的链接,容器可以root身份运行。但是,所有服务应使用服务用户运行。因此,我创建了一个gpadmin
用户来启动数据库。
docker run -i -d -v /tmp/$(mktemp -d):/run -p 5432:5432 -p 28080:28080 --name gpdb-centos --hostname mdw gpdb-postgres9.4/centos /usr/sbin/sshd -D
docker exec -it gpdb-centos sh -c "su - gpadmin -c 'echo 'y' | /home/gpadmin/greenplum_start.sh' && hostname -i"
答案 0 :(得分:-1)
-i -t -d
选项告诉docker为输入配置文件描述符,将输入配置为伪tty(终端),并将该容器与当前命令提示符分离。它不能保证容器将继续运行,这取决于您在容器内运行的命令。
从您的输出中,您正在运行的命令似乎是“ / usr / sbin / sshd -D”,需要root访问权限才能绑定到端口22,读取/ etc中的配置文件以及写入/ var中的文件。
要调试容器内失败的命令,应查看日志并检查容器以查看失败的原因以及原因。的命令是:
docker logs $container_id
docker inspect $container_id
在您的示例中,$container_id
将为24f00ec4e531
。