使用单个Dockerfile添加vsftpd用户目录并设置密码
使用单个Dockerfile添加vsftpd用户目录并设置密码
我有一个Docker容器,里面运行了一些进程(uwsgi和celery)。我想为这些进程创建一个uwsgi用户和一个celery用户,并为它们创建一个工作组,以便分配权限。
我尝试将RUN adduser uwsgi
和RUN adduser celery
添加到我的Dockerfile中,但这会导致问题,因为这些命令需要输入(我在下面发布了构建时的响应)。
为了为容器中运行的worker设置权限,添加用户到Docker容器的最佳方法是什么?
我的Docker镜像是从官方的Ubuntu14.04基础镜像构建的。
当运行adduser命令时,以下是Dockerfile的输出:
正在添加用户'uwsgi'... 正在添加新组'uwsgi'(1000)... 正在添加新用户'uwsgi'(1000),与组'uwsgi'... 正在创建家目录'/home/uwsgi'... 正在从'/etc/skel'复制文件... [91m输入新的UNIX密码:重新输入新的UNIX密码:[0m [91mpasswd:身份验证令牌操作错误 passwd:密码未更改 [0m [91m在/usr/sbin/adduser第563行,chop中未初始化的值$answer的使用。 [0m [91m在/usr/sbin/adduser第564行中,未初始化的值$answer的使用。 [0m 再试一次?[y/N] 为uwsgi更改用户信息 输入新值,或按ENTER使用默认值 全名[]: 房间号[]: 工作电话[]: 家庭电话[]: 其他[]: [91m在/usr/sbin/adduser第589行,chop中未初始化的值$answer的使用。 [0m [91m在/usr/sbin/adduser第590行中,未初始化的值$answer的使用。 [0m 信息正确吗?[Y/n] ---> 258f2f2f13df 正在删除中间容器59948863162a 步骤5:RUN adduser celery ---> 正在运行中be06f1e20f64 正在添加用户'celery'... 正在添加新组'celery'(1001)... 正在添加新用户'celery'(1001),与组'celery'... 正在创建家目录'/home/celery'... 正在从'/etc/skel'复制文件... [91m输入新的UNIX密码:重新输入新的UNIX密码:[0m [91mpasswd:身份验证令牌操作错误 passwd:密码未更改 [0m [91m在/usr/sbin/adduser第563行,chop中未初始化的值$answer的使用。 [0m [91m在/usr/sbin/adduser第564行中,未初始化的值$answer的使用。 [0m 再试一次?[y/N] 为celery更改用户信息 输入新值,或按ENTER使用默认值 全名[]: 房间号[]: 工作电话[]: 家庭电话[]: 其他[]: [91m在/usr/sbin/adduser第589行,chop中未初始化的值$answer的使用。 [0m [91m在/usr/sbin/adduser第590行中,未初始化的值$answer的使用。 [0m 信息正确吗?[Y/n]
问题的原因是在Dockerfile中使用adduser命令时,无法设置用户密码和附加信息。解决方法是使用--disabled-password参数来禁用密码,并在后续步骤中设置密码。
为了避免adduser命令的交互问题,可以使用以下参数调用:
RUN adduser --disabled-password --gecos '' newuser
其中,--gecos参数用于设置附加信息,这里设置为空。
在使用busybox系统(如Alpine)时,可以使用以下命令:
RUN adduser -D -g '' newuser
详见busybox adduser文档。
感谢!看起来一般更倾向于使用adduser高级解决方案,而不是使用useradd等低级函数。
adduser: unrecognized option: gecos 这在Alpine上似乎不起作用。
--disabled-password参数的作用是禁用密码,那么如何在Dockerfile中同时设置用户的密码呢?
问题的出现原因是无法通过单个Dockerfile来添加vsftpd用户目录并设置密码。解决方法是使用以下命令在Dockerfile中添加用户目录和设置密码:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu
其中,`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。
- `-p`或`--password PASSWORD`:指定新账户的加密密码。
如果需要设置用户密码,可以在`useradd`命令中添加`-p "$(openssl passwd -1 ubuntu)"`。另一种方法是在Dockerfile中添加以下命令:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
第一个`shell`指令是为了确保在具有管道的`RUN`命令之前启用`-o pipefail`选项。这样可以避免一些潜在的问题。
关于为什么用户会在root组中的问题,这取决于具体的使用情况。root组并不表示用户具有root访问权限,只是表示用户对某些文件(如日志)具有更多的读取权限,这在某些项目中是有用的。
至于生成的文件仍然属于root所有的问题,可能是由于在使用bash命令时以root权限执行。可以检查一下是否在执行bash命令时要求输入root密码。另外,也可以尝试使用`USER user`命令将用户切换为非root用户。
关于以交互方式设置密码的问题,可以尝试使用以下命令:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
如果这种方式不起作用,可能是出现了错误。可以检查一下是否有其他步骤或命令导致了问题。
为了安全起见,推荐使用`-p "$(openssl passwd -6 YOUR_PASS_HERE)"`来设置密码。`-1`选项使用基于MD5的哈希,这是不安全的(在数据库泄漏的情况下)。
以上是解决"Add vsftpd user directory using single Dockerfile and set password"问题的方法和原因。
问题的出现原因:需要在Dockerfile中添加vsftpd用户目录并设置密码,但是使用交互式命令adduser时遇到问题。
解决方法:可以使用非交互式命令useradd来创建用户,并通过设置权限和执行程序来确保用户可以正常运行。在Dockerfile中使用以下命令:
RUN useradd -ms /bin/bash newuser USER newuser WORKDIR /home/newuser
然后可以使用chpasswd命令来设置密码:
RUN echo 'newuser:newpassword' | chpasswd
如果需要给用户sudo权限,可以使用以下命令:
RUN addusersudo
需要注意的是,在alpine Linux中,需要安装shadow包才能使用useradd命令:
RUN apk add shadow
而在Windows系统中,可以使用adduser命令来添加用户。
如果遇到权限问题,可以尝试使用sudo命令,但可能会遇到sudo: no tty present and no askpass program specified的错误。
如果需要将用户添加到特定的组中,可以使用以下命令:
RUN usermod -aGnewuser
通过使用非交互式命令useradd和chpasswd,以及设置权限和执行程序,可以在Dockerfile中添加vsftpd用户目录并设置密码。如果需要sudo权限或将用户添加到特定组中,可以使用相应的命令。在alpine Linux中,可能需要安装shadow包才能使用useradd命令。在Windows系统中,可以使用adduser命令来添加用户。