如何向 Docker 容器添加用户?
- 2024-10-17 08:47:00
- admin 原创
- 70
问题描述:
我有一个 docker 容器,里面运行着一些进程(uwsgi 和 celery)。我想为这些进程创建一个 celery 用户和一个 uwsgi 用户,以及一个它们都属于的工作组,以便分配权限。
我尝试将RUN adduser uwsgi
和添加RUN adduser celery
到我的 Dockerfile 中,但这会导致问题,因为这些命令提示输入(我已在下面发布了构建的响应)。
将用户添加到 Docker 容器以便为在容器中运行的工作程序设置权限的最佳方法是什么?
我的Docker镜像是基于官方Ubuntu14.04基础构建的。
以下是运行 adduser 命令时 Dockerfile 的输出:
Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ...
Adding new user `uwsgi' (1000) with group `uwsgi' ...
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []: Work Phone []: Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
---> 258f2f2f13df
Removing intermediate container 59948863162a
Step 5 : RUN adduser celery
---> Running in be06f1e20f64
Adding user `celery' ...
Adding new group `celery' (1001) ...
Adding new user `celery' (1001) with group `celery' ...
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for celery
Enter the new value, or press ENTER for the default
Full Name []: Room Number []: Work Phone []:
Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
解决方案 1:
诀窍是使用useradd
而不是其交互式包装器adduser
。我通常使用以下方式创建用户:
RUN useradd -ms /bin/bash newuser
它为用户创建一个主目录并确保 bash 是默认 shell。
然后您可以添加:
USER newuser
WORKDIR /home/newuser
到你的dockerfile。 之后的每个命令以及交互式会话都将以用户身份执行newuser
:
docker run -t -i image
newuser@131b7ad86360:~$
在调用用户命令之前,您可能必须授予newuser
执行您想要运行的程序的权限。
出于安全原因,在容器内使用非特权用户是个好主意。但它也有一些缺点。最重要的是,从你的镜像中获取镜像的人必须切换回 root 权限,然后才能以超级用户权限执行命令。
解决方案 2:
Ubuntu
尝试以下几行Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
useradd
选项(参见man useradd
:):
-r
,--system
创建系统帐户。请参阅:创建系统帐户的含义-m
,--create-home
创建用户的主目录。-d
,--home-dir HOME_DIR
新帐户的主目录。-s
,--shell SHELL
新账户的登录shell。-g
,--gid GROUP
主要组的名称或ID。-G
,--groups GROUPS
补充群组列表。-u
,--uid UID
指定用户 ID。请参阅:了解 uid 和 gid 在 Docker 容器中的工作原理-p
,--password PASSWORD
新账户的加密密码(例如ubuntu
)。
设置默认用户密码
要设置用户密码,请添加-p "$(openssl passwd -1 ubuntu)"
到useradd
命令。
或者将以下几行添加到您的Dockerfile
:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
第一个shell 指令是确保在使用管道-o pipefail
之前启用该选项。阅读更多: Hadolint:对 Dockerfile 进行 Linting。RUN
解决方案 3:
为了避免adduser的交互式提问,你可以使用以下参数来调用它:
RUN adduser --disabled-password --gecos '' newuser
该--gecos
参数用于设置附加信息。本例中为空。
在带有 busybox 的系统上(例如 Alpine),使用
RUN adduser -D -g '' newuser
查看busybox adduser
解决方案 4:
从安全角度来看,在 docker 中添加用户并以该用户身份运行应用程序是一种非常好的做法。为此,我建议执行以下步骤:
FROM node:10-alpine
# Copy source to container
RUN mkdir -p /usr/app/src
# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app
WORKDIR /usr/app
# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production
# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup
# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup
# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app
# Switch to 'appuser'
USER appuser
# Open the mapped port
EXPOSE 3000
# Start the process
CMD ["npm", "start"]
以上步骤是复制 NodeJS 项目文件、创建用户组和用户、为用户分配项目文件夹的权限、切换到新创建的用户并在该用户下运行应用程序的完整示例。
解决方案 5:
可以模仿开源的Dockerfile,例如:
节点: node12-github
RUN groupadd --gid 1000 node \n && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
超集: superset-github
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash
superset
我认为这是关注开源的好方法。
解决方案 6:
每个人都有自己最喜欢的,这是我的:
RUN useradd --user-group --system --create-home --no-log-init app
USER app
参考:man useradd ( alt )
上面这一RUN
行将添加用户和组app
:
root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)
如果要将图像重新用作基础图像,请使用更具体的名称app
。另外,--shell /bin/bash
如果您确实需要,请包含。
部分荣誉:Ryan M 的回答
解决方案 7:
或者,您也可以这样做。
RUN addgroup demo && adduser -DH -G demo demo
第一个命令创建名为demo 的组。第二个命令创建demo用户并将其添加到之前创建的demo组。
旗帜代表:
-G Group
-D Don't assign password
-H Don't create home directory
解决方案 8:
WORKDIR /api
RUN adduser -D nameuser
COPY --from=builder --chown=nameuser:nameuser /api
USER nameuser
解决方案 9:
请在 dockerfile 中添加以下条目以便在容器中创建 sudo 用户。
RUN useradd -m -s /bin/bash ubuntu
RUN usermod -aG sudo ubuntu && echo "ubuntu ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ubuntu
RUN chmod 0440 /etc/sudoers.d/ubuntu // should be 0440
USER ubuntu:ubuntu
WORKDIR /home/ubuntu
解决方案 10:
将此行添加到您的 Dockerfile(您可以通过这种方式运行任何 Linux 命令)
RUN useradd -ms /bin/bash yourNewUserName
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件