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
谢谢 :)
这是因为您的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)
一点解释:
sudo: no tty present and no askpass program specified
还要尝试避免多次使用相同的 Dockerfile 指令(在您的情况下,您有多余的 4x RUN)。每个指令都是以后构建映像中的一个单独层。这是众所周知的Dockerfile 最佳实践。
最小化层数 在旧版本的 Docker 中,最小化图像中的层数以确保它们的性能非常重要。添加了以下功能以减少此限制:
在 Docker 1.10 及更高版本中,只有指令 RUN、COPY、ADD 创建层。其他指令创建临时中间映像,不直接增加构建的大小。
归档时间: |
|
查看次数: |
5289 次 |
最近记录: |