如何在Docker中运行sudo命令 解决镜像构建时sudo需输入密码的问题
问题根源
- Docker 构建为非交互流程,无法响应 sudo 的密码输入请求
- 你在 Dockerfile 中提前切换到了普通用户
docker,后续执行sudo apt install时需要密码验证,直接触发报错 - 额外冗余问题:Dockerfile 仅最后一条
CMD指令会生效,你编写的多个CMD /bin/bash无实际作用,会被后续指令覆盖
解决方案
提供两种可行方案,优先选择第一种:
方案1(最优,推荐):系统依赖安装全部在 root 用户下完成,无需使用 sudo
Docker 构建默认以 root 用户运行,安装系统软件天然具备权限,完全不需要引入 sudo、切换普通用户后再用 sudo 安装的冗余逻辑,还可以减小镜像体积。
方案2(必须保留普通用户下执行安装逻辑时使用):配置无密码 sudo
创建 docker 用户后追加 sudoers 配置,允许该用户执行 sudo 无需输入密码:
RUN echo "docker ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
修正后可正常构建的 Dockerfile
FROM ubuntu:latest # root 用户下直接安装所有系统依赖,无需sudo,清理缓存减小镜像体积 RUN apt-get -y update && apt-get -y install sqlite3 python3 python3-pip && rm -rf /var/lib/apt/lists/* # 创建普通用户 RUN useradd -m docker # 切换到普通用户运行后续步骤,避免容器以root权限运行的安全风险 USER docker # 普通用户仅对自身家目录有写权限,因此数据库文件建在家目录下 RUN mkdir /home/docker/db RUN /usr/bin/sqlite3 /home/docker/db/test.db WORKDIR /usr/src/app ENV FLASK_APP=__init__.py ENV FLASK_DEBUG=1 ENV FLASK_RUN_HOST=0.0.0.0 ENV FLASK_ENV=development COPY requirements.txt requirements.txt # 普通用户安装pip依赖添加--user参数避免权限报错 RUN pip3 install --user -r requirements.txt COPY . . CMD ["flask", "run"]
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

