dru*_*ubb 223 sudo docker linux-containers
通常,使用用户root运行docker容器.我想使用不同的用户,使用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
Run Code Online (Sandbox Code Playgroud)
运行此容器,我使用用户'docker'登录.当我尝试使用sudo时,找不到该命令.所以我尝试使用在我的Dockerfile中安装sudo包
RUN apt-get install sudo
Run Code Online (Sandbox Code Playgroud)
这导致无法找到包sudo
dru*_*ubb 216
刚刚得到它.Regan指出,我不得不将用户添加到sudoers组.但主要原因是我忘了更新存储库缓存,所以apt-get找不到sudo包.它现在正在运作.这是完成的代码:
FROM ubuntu:12.04
RUN apt-get update && \
apt-get -y install sudo
RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo
USER docker
CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)
M. *_*ord 63
其他答案对我不起作用.我一直在搜索并找到一篇博客文章,其中介绍了团队如何在docker容器中运行非root用户.
这是TL; DR版本:
RUN apt-get update
RUN apt-get install sudo
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
# this is where I was running into problems with the other approaches
RUN sudo apt-get update
Run Code Online (Sandbox Code Playgroud)
我正在使用FROM node:9.3这个,但我怀疑其他类似的容器基地也可以.
Tom*_*ský 58
当容器中既没有sudo也没有apt-get时,您也可以使用命令以root用户身份跳转到正在运行的容器中
docker exec -u root -t -i container_id /bin/bash
Run Code Online (Sandbox Code Playgroud)
小智 17
如果你想连接到容器并
使用apt-get
首先安装一些东西,如上面的回答我们的兄弟"TomášZáluský"
docker exec -u root -t -i container_id /bin/bash
Run Code Online (Sandbox Code Playgroud)
然后尝试
运行apt-get update或apt-get'你想要的任何东西'
它与我合作希望它对所有人都有用
Chr*_*ris 16
对于那些已经在运行的容器中遇到此问题,而又不必重建的人,以下命令将以root权限连接到正在运行的容器:
docker exec -ti -u root container_name bash
Run Code Online (Sandbox Code Playgroud)
您还可以通过以下方式找到它,使用其ID而不是其名称进行连接:
docker ps -l
Run Code Online (Sandbox Code Playgroud)
要保存您的更改,以使它们在您下次启动容器(或docker-compose集群)时仍然存在:
docker commit container_id image_name
Run Code Online (Sandbox Code Playgroud)
要启动未运行的容器并以root用户身份连接,请执行以下操作:
docker run -ti -u root --entrypoint=/bin/bash container_name -s
Run Code Online (Sandbox Code Playgroud)
要从正在运行的容器中复制:
docker cp <containerId>:/file/path/within/container /host/path/target
Run Code Online (Sandbox Code Playgroud)
导出图像的副本:
docker save container | gzip > /dir/file.tar.gz
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法还原到另一个Docker安装中:
gzcat /dir/file.tar.gz | docker load
Run Code Online (Sandbox Code Playgroud)
使用以下命令可以更快地进行压缩,但是占用更多空间来进行压缩:
docker save container | dir/file.tar
Run Code Online (Sandbox Code Playgroud)
和:
cat dir/file.tar | docker load
Run Code Online (Sandbox Code Playgroud)
以下是我使用以下基本映像设置非 root 用户的方法ubuntu:18.04:
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
Run Code Online (Sandbox Code Playgroud)
上面的代码会发生什么:
foo已创建。foo被添加到 thefoo和sudogroup。uid和gid被设置为值999。/home/foo./bin/bash.sed命令会在线更新的/etc/sudoers文件,以允许foo和root用户密码的来访问sudo组。sed命令禁用#includedir允许子目录中的任何文件覆盖这些内联更新的指令。如果在容器内无法访问SUDO或apt-get,您可以在运行容器中使用下面的选项。
docker exec -u root -it f83b5c5bf413 ash
Run Code Online (Sandbox Code Playgroud)
“ f83b5c5bf413”是我的容器 ID,这里是我终端的工作示例:
这可能不适用于所有映像,但某些映像已包含 root 用户,例如在 jupyterhub/singleuser 映像中。有了这张图片,就很简单了:
USER root
RUN sudo apt-get update
Run Code Online (Sandbox Code Playgroud)
主要思想是,您需要根据容器创建一个root用户的用户。
主要命令:
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo
Run Code Online (Sandbox Code Playgroud)
第一个发送文字字符串,bot:bot用chpasswd密码创建用户机器人bot,chpasswd 的作用是:
The chpasswd command reads a list of user name and password pairs from standard input and uses this information to update a group of existing users. Each line is of the format:
user_name:password
By default the supplied password must be in clear-text, and is encrypted by chpasswd. Also the password age will be updated, if present.
Run Code Online (Sandbox Code Playgroud)
我假设的第二个命令将用户机器人添加为 sudo。
完整的 docker 容器可供使用:
FROM continuumio/miniconda3
# FROM --platform=linux/amd64 continuumio/miniconda3
MAINTAINER Brando Miranda "me@gmail.com"
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ssh \
git \
m4 \
libgmp-dev \
opam \
wget \
ca-certificates \
rsync \
strace \
gcc \
rlwrap \
sudo
# https://github.com/giampaolo/psutil/pull/2103
RUN useradd -m bot
# format for chpasswd user_name:password
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo
WORKDIR /home/bot
USER bot
#CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)
与接受的答案不同,我usermod改为使用。
假设已经在 docker 中以 root 身份登录,并且“fruit”是我要添加的新的非 root 用户名,只需运行以下命令:
apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit
Run Code Online (Sandbox Code Playgroud)
更新后记得保存图片。使用docker ps获得当前正在运行的码头工人的<容器ID>和<IMAGE>,然后运行docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>以节省码头工人的形象。
然后测试:
su fruit
sudo whoami
Run Code Online (Sandbox Code Playgroud)
或者在启动 docker 时以非 root 用户身份直接登录(确保先保存图像)进行测试:
docker run -it --user fruit <IMAGE>
sudo whoami
Run Code Online (Sandbox Code Playgroud)
您可以使用sudo -k重置密码提示时间戳:
sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219616 次 |
| 最近记录: |