如何编写 Dockerfile 来更改 docker 图像中受保护的文本文件?

How do I write a Dockerfile which changes a protected text file in the docker image?

我有一个遵循这种模式的 Dockerfile:

RUN echo "[DOCKER BUILD] Installing image dependencies..." && \
    apt-get update -y && \
    apt-get install -y sudo package_names ...

RUN useradd -ms /bin/bash builder
# tried this too, same error
# RUN useradd -m builder && echo "builder:builder" | chpasswd && adduser builder sudo
RUN mkdir -p /home/builder && chown -R builder:builder /home/builder
USER builder 

RUN sudo sed -i '/hosts:/c\hosts: files dns' /etc/nsswitch.conf

不起作用的部分是编辑 /etc/nsswitch.conf ... 为什么我不能配置我的图像来编辑这个文件?

我已经尝试通过几种不同的方式调整 useradd,但当前的错误是:

步骤 8/10:运行 sudo sed -i '/hosts:/c\hosts: 文件 dns' /etc/nsswitch.conf ---> 运行 在 97cd39584950 sudo:不存在 tty 且未指定 askpass 程序 命令 '/bin/sh -c sudo sed -i '/hosts:/c\hosts: files dns' /etc/nsswitch.conf' 返回非零代码:1

如何在图像中编辑这个文件?

一条评论 here 建议 dockerfile 中的所有操作都应该 运行 作为 root,这让我相信不需要 sudo。为什么我会看到这个?

RUN sed -i '/hosts:/c\hosts: files dns' /etc/nsswitch.conf

步骤 8/10:运行 sed -i '/hosts:/c\hosts: 文件 dns' /etc/nsswitch.conf ---> 运行 在 ad56ca17944c sed:无法打开临时文件 /etc/sed8KGQzP:权限被拒绝

问题出在 sudo 的密码或密码请求上。您需要将 ENV_VARIABLES 传递给与删除 sudo 请求密码相关的容器,如下所示:

<your-container-user> ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

您需要自由执行sudo。

相关问题:

How to fix 'sudo: no tty present and no askpass program specified' error?

我想通了 -- 我可以在没有 sudo 的情况下执行此任务,但前提是我在调用 USER builder 之前执行此操作。在我创建任何用户之前,docker 似乎具有所需的正确访问权限。