在 dockerfile 中处理用户并在其上安装软件包权限被拒绝

fla*_*bet 1 permissions root package docker dockerfile

我想以 /home/user 中的用户身份在 dockefile 上安装软件包。

FROM ubuntu:16.04

ENV user lg

RUN useradd -m -d /home/${user} ${user} \
 && chown -R ${user} /home/${user}

USER ${user}

WORKDIR /home/${user}

RUN apt-get update

RUN apt-get -y install curl

RUN apt-get -y install lsb-core

RUN apt-get -y install lsb

RUN apt-get -y upgrade -f
Run Code Online (Sandbox Code Playgroud)

Docker 在执行时抛出错误 apt-get update

E: 列表目录 /var/lib/apt/lists/partial 丢失。- Acquire (13: Permission denied) 命令“/bin/sh -c apt-get update”返回非零代码:100

谢谢 :)

Rao*_*zur 6

这是因为您的lg用户根本没有必要的权限。在这种情况下,ubuntu 是否被 dockerized 并不重要。这就像在任何其他 Linux 发行版中一样 - 您需要权限才能执行某些操作。一个例子:如果你在你的本地系统上创建一个新用户,我敢打赌命令apt-get install X会引发完全相同的错误,不是吗?

为了安装任何东西,您需要sudo为此用户以 root 身份进行身份验证。这可以像这样实现:

FROM ubuntu:16.04

RUN apt-get update && \
    apt-get -y install sudo

ENV user lg

RUN useradd -m -d /home/${user} ${user} && \
    chown -R ${user} /home/${user} && \
    adduser ${user} sudo && \
    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER ${user}

WORKDIR /home/${user}

RUN sudo apt-get -y install curl && \
    sudo apt-get -y install lsb-core && \
    sudo apt-get -y install lsb && \
    sudo apt-get -y upgrade -f
Run Code Online (Sandbox Code Playgroud)

一点解释:

  1. 首先,您需要安装 sudo 包
  2. 将您的用户添加到 sudo
  3. 并且您还需要将 NOPASSWD 添加到 sudoers 文件中(我已经为所有人完成了,但您可以轻松地为特定用户设置它)。没有这个,你会遇到以下错误:sudo: no tty present and no askpass program specified
  4. 现在你可以用这个用户安装东西

还要尝试避免多次使用相同的 Dockerfile 指令(在您的情况下,您有多余的 4x RUN)。每个指令都是以后构建映像中的一个单独层。这是众所周知的Dockerfile 最佳实践

最小化层数 在旧版本的 Docker 中,最小化图像中的层数以确保它们的性能非常重要。添加了以下功能以减少此限制:

在 Docker 1.10 及更高版本中,只有指令 RUN、COPY、ADD 创建层。其他指令创建临时中间映像,不直接增加构建的大小。