通常,docker容器使用root用户运行。我想使用一个不同的用户,这是没有问题使用docker的user指令。但是这个用户应该能够在容器内使用sudo。该命令缺失。
下面是一个简单的Dockerfile:
FROM ubuntu:12.04
RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker
USER docker
CMD /bin/bash
运行这个容器,我以用户“docker”登录。当我尝试使用sudo时,没有找到该命令。所以我尝试在我的Dockerfile中使用sudo包安装
RUN apt-get install sudo
这将导致无法定位包sudo
下面是我如何使用ubuntu:18.04的基本映像来设置一个非root用户:
RUN \
groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "Customized the sudoers file for passwordless access to the foo user!" && \
echo "foo user:"; su - foo -c id
上面的代码发生了什么:
创建用户和组foo。
用户foo被加入到foo组和sudo组中。
uid和gid设置为999。
主目录设置为“/home/foo”。
shell被设置为/bin/bash
sed命令对/etc/sudoers文件进行内联更新,以允许foo和root用户无密码访问sudo组。
sed命令禁用#includedir指令,该指令将允许子目录中的任何文件覆盖这些内联更新。
下面是我如何使用ubuntu:18.04的基本映像来设置一个非root用户:
RUN \
groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "Customized the sudoers file for passwordless access to the foo user!" && \
echo "foo user:"; su - foo -c id
上面的代码发生了什么:
创建用户和组foo。
用户foo被加入到foo组和sudo组中。
uid和gid设置为999。
主目录设置为“/home/foo”。
shell被设置为/bin/bash
sed命令对/etc/sudoers文件进行内联更新,以允许foo和root用户无密码访问sudo组。
sed命令禁用#includedir指令,该指令将允许子目录中的任何文件覆盖这些内联更新。