作者:蜜爱女_201 | 来源:互联网 | 2023-05-29 08:50
我有一个docker容器,里面运行着一些进程(uwsgi和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]
小智..
410
诀窍是使用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
在调用user命令之前,您可能必须授予执行要运行的程序的权限.
出于安全原因,在容器内使用非特权用户是个好主意.它也有一些缺点.最重要的是,从图像中获取图像的人必须切换回root才能执行具有超级用户权限的命令.
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
在调用user命令之前,您可能必须授予执行要运行的程序的权限.
出于安全原因,在容器内使用非特权用户是个好主意.它也有一些缺点.最重要的是,从图像中获取图像的人必须切换回root才能执行具有超级用户权限的命令.
我建议在Dockerfile中使用全名选项,比如在脚本中,而不是短脚本(在交互式IMO使用时更多).`useradd --create-home --shell/bin/bash`对于同事来说更容易理解/可读.
为了设置密码,您可以使用chpasswd,如:`RUN echo'newuser:newpassword'| chpasswd`
不错的小贴士,@ iuridiniz!不要忘记在"USER newuser"之前调用它.如果您还需要用户拥有root权限,您还可以包含`adduser
sudo`.
`/ bin/sh:useradd:not found` alpine linux
请注意,如果您要创建具有大用户ID的新用户,则docker在尝试创建* lastlog *(海量稀疏文件)时可能会挂起/崩溃。避免使用useradd的--no-log-init选项。
2> Raffael..:
要避免adduser的交互式问题,您可以使用以下参数调用它:
RUN adduser --disabled-password --gecos '' newuser
该--gecos
参数用于设置附加信息.在这种情况下它只是空的.
在使用busybox(如Alpine)的系统上,请使用
RUN adduser -D -g '' newuser
请参阅busybox adduser
谢谢!看起来像'adduser`高级解决方案通常更喜欢使用像`useradd`这样的低级函数.
3> kenorb..:
Ubuntu的
请尝试以下行Dockerfile
:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 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)"
到上面的命令.
用户为什么会在根组中?这不是要出于安全目的而拥有非root用户的全部意思
@Novaterata取决于用途。“ root”组并不表示他们具有root用户访问权限,只是他们具有对某些文件(例如日志)的更多读访问权限,这很有用,但这取决于项目。
4> S.Mishra..:
从安全角度来看,在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项目文件,创建用户组和用户,为用户分配项目文件夹权限,切换到新创建的用户并在该用户下运行应用程序的完整示例。