How to use sudo inside a docker container?
通常,使用用户root运行docker容器。 我想使用不同的用户,使用docker的USER指令没问题。 但是这个用户应该能够在容器内使用sudo。 缺少此命令。
这是一个简单的Dockerfile用于此目的:
1 2 3 4 5 6 7 | 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包
1 | RUN apt-get install sudo |
这导致无法找到包sudo
刚刚得到它。 Regan指出,我不得不将用户添加到sudoers组。但主要原因是我忘了更新存储库缓存,所以apt-get找不到sudo包。它现在正在运作。这是完成的代码:
1 2 3 4 5 6 7 8 9 | 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 |
其他答案对我不起作用。我一直在搜索并找到一篇博客文章,其中介绍了团队如何在docker容器中运行非root用户。
这是TL; DR版本:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
我正在使用
当容器中既没有sudo也没有apt-get时,您也可以使用命令以root用户身份跳转到正在运行的容器中
1 | docker exec -u root -t -i container_id /bin/bash |
如果你想连接到容器并安装一些东西
使用apt-get
首先是我们的兄弟"Tomá?Zálusky"的上述回答
1 | docker exec -u root -t -i container_id /bin/bash |
然后尝试
RUN apt-get update or apt-get 'anything you want'
它与我合作
希望它对所有人都有用
对于已经运行容器存在此问题的任何人,并且他们不一定要重建,以下命令将连接到具有root权限的正在运行的容器:
1 | docker exec -ti -u root container_name bash |
您还可以使用其ID而不是其名称进行连接,方法是:
1 | docker ps -l |
要保存更改,以便在下次启动容器(或docker-compose集群)时它们仍然存在:
1 | docker commit container_id image_name |
要启动未运行的容器并以root身份连接:
1 | docker run -ti -u root --entrypoint=/bin/bash container_name -s |
要从正在运行的容器中复制:
1 | docker cp <containerId>:/file/path/within/container /host/path/target |
要导出图像的副本:
1 | docker save container | gzip > /dir/file.tar.gz |
您可以使用以下命令恢复到另一个Docker安装:
1 | gzcat /dir/file.tar.gz | docker load |
使用以下内容可以更快,但需要更多空间来进行压缩:
1 | docker save container | dir/file.tar |
和:
1 | cat dir/file.tar | docker load |
如果您有一个以root身份运行的容器来运行需要访问
例如在你的Dockerfile中:
1 2 3 4 5 6 7 | RUN if type sudo 2>/dev/null; then \ echo"The sudo command already exists... Skipping."; \ else \ echo -e"#!/bin/sh \${@}"> /usr/sbin/sudo; \ chmod +x /usr/sbin/sudo; \ fi |