【问题标题】:Starting a Docker container with a user different from the one on the host使用与主机上不同的用户启动 Docker 容器
【发布时间】:2019-05-13 16:18:12
【问题描述】:

我正在尝试在 Ubuntu 服务器上部署映像。问题是我希望容器有 root 以外的用户。换句话说,我想在该用户下启动容器。

我尝试过的。 我已经在我的容器中成功创建了一个具有图像的用户。 我尝试使用 docker start 命令启动容器,但不成功。

我尝试使用在 dockerfile 中定义的用户创建一个新容器,但也不成功。

root@juju_dev_server:/home/dev# sudo docker run -it --user dev d08d53c4d78b
docker: Error response from daemon: linux spec user: unable to find user dev: no matching entries in passwd file

.

这是我的 dockerfile

 FROM debian

RUN groupadd -g 61000 dev
RUN useradd -g 61000 -l -m -s /bin/false -u 61000 dev
USER dev

CMD ["bash"]



FROM java:8
EXPOSE 8080
ADD /target/juju-0.0.1.jar juju-0.0.1.jar
ENTRYPOINT ["java","-jar","juju-0.0.1.jar"]

【问题讨论】:

  • 解释-1。问题很明确。
  • @Claudio 更正不正确。用户定义和用户定义不一样this。第一个是名词和动词。第二个是单名词。

标签: linux bash docker ubuntu debian


【解决方案1】:

我是怎么做到的,我使用的是 Alpine 而不是 Ubuntu,但它应该可以正常工作:

以称为“开发者”的用户身份创建和运行

Dockerfile

RUN /bin/bash -c "adduser -D -u 1000 developer"
RUN passwd -d developer

RUN chown -R developer /home/developer/.bash*

RUN echo "developer    ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer

ENTRYPOINT ["/entrypoint.sh"]
CMD ["bash"]

入口点.sh

# stuff I need running as root here. Then below runs a bash shell as "developer"
sudo -u developer -H bash -c "$@;"

我想你会想要将你的 ENTRYPOINT 更改为 CMD 或类似的,或者将它写入你的 entrypoint.sh,但是你想启动你的 java 东西。

【讨论】:

  • 要创建用户开发者吗?在主机或容器上?
  • Dockerfile 中定义的任何内容都不会在主机上执行任何操作(当然安装的卷除外)。
  • 我仍然不断收到:passwd 文件中没有匹配的条目。尝试运行以下命令时:sudo docker run -it --user developer d08d53c4d78b
  • @DannyB 不过,我写它已经很久了,所以我不记得我如何实现它背后的所有逻辑。但它对我来说非常有效。
  • @NesanMano 在您尝试运行 docker logs {container_name} 时会给您带来什么?它会在容器上创建用户开发者。此外,如果您使用提供的入口点代码,则不需要指定 --user 或类似的东西。
【解决方案2】:

您显示的 Dockerfile 创建了两个图像。第一个是具有非 root 用户的普通 debian 图像。第二个忽略了第一个,是一个有点常规的 Java 映像。

您需要在同一张图片中执行这两个步骤。如果我要编写你的 Dockerfile,它可能看起来像

FROM java:8
EXPOSE 8080

# (Prefer COPY to ADD unless you explicitly want its
# auto-unpacking semantics.)
COPY /target/juju-0.0.1.jar juju-0.0.1.jar

# Set up a non-root user context, after COPYing content
# in.  (Prevents the application from overwriting
# itself as a useful security measure.)
RUN groupadd -g 61000 app
RUN useradd -g 61000 -l -m -s /bin/false -u 61000 app
USER app

# Set the main container command.  (Generally prefer
# CMD to ENTRYPOINT if you’re only using one; it makes
# both getting debugging shells and later adopting the
# pattern of an initializing entrypoint script easier.)
CMD ["java","-jar","juju-0.0.1.jar"]

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 2017-04-26
    • 2023-01-24
    • 2015-04-10
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多