【问题标题】:Docker container exiting immediately if run as non-root user如果以非 root 用户身份运行,Docker 容器将立即退出
【发布时间】:2019-01-07 19:42:55
【问题描述】:

我正在关注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"

【问题讨论】:

    标签: docker


    【解决方案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

    【讨论】:

    • 是的。该服务需要 /etc/config/sshd 访问权限,该访问权限仅允许 root。将新用户添加到 root 组后,我可以使用非 root 用户运行容器。感谢 docker logs 命令。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多