问题示例:
docker run -ti -v my_passwd:/etc/passwd -v my_shadow:/etc/shadow --rm centos
[root@681a5489f3b0 /]# useradd test # does not work !?
useradd: failure while writing changes to /etc/passwd
[root@681a5489f3b0 /]# ll /etc/passwd /etc/shadow # permission check
-rw-r--r-- 1 root root 157 Oct 8 10:17 /etc/passwd
-rw-r----- 1 root root 100 Oct 7 18:02 /etc/shadow
字符串
使用passwd时也会出现类似的问题:
[root@681a5489f3b0 /]# passwd test
Changing password for user test.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: Authentication token manipulation error
型
我试过使用ubuntu镜像,但同样的问题出现了。
我可以在容器中手动编辑passwd文件和shadow文件。
我在以下两台机器上遇到了同样的问题:
主机操作系统:CentOS 7 - SELinux禁用
Docker版本:1.8.2,构建版本0a 8 c2 e3
主机操作系统:CoreOS 766.4.0
Docker版本:1.7.1,build df2f73d-dirty
我也在GitHub上发布了这个问题:https://github.com/docker/docker/issues/16857
2条答案
按热度按时间xv8emn3q1#
失败的原因是
passwd
操作了一个临时文件,然后试图将其重命名为/etc/shadow
。这会失败,因为/etc/shadow
是一个挂载点--不能被替换--这会导致以下错误(使用strace
捕获):字符串
你可以从命令行简单地复制这个:
型
您可以通过在其他地方挂载包含
my_shadow
和my_passwd
的目录,然后在容器中适当地符号链接/etc/passwd
和/etc/shadow
来解决此问题:型
nwlls2ji2#
我今天遇到了这个问题。在尝试了基本上所有的方法之后,我得出了一个不幸的结论,即没有好的方法来生成
passwd
,useradd
,groupadd
等。所有高兴没有挂载整个/etc
目录.一个可取之处是,如果你使用的是最小化的底座,它可能不会占用太多的空间(例如:alpine,bitnami/minideb)。下面是我尝试的事情以及它们失败的原因:
| 问题| Problem |
| --| ------------ |
|
useradd
和groupadd
失败(推测userdel
和groupdel
也会失败)|useradd
andgroupadd
failure (presumablyuserdel
andgroupdel
will fail too) || 硬链接不能跨越文件系统边界| hard links cannot cross file system boundary |
| 一切都失败了| everything fails |
| 潜在竞态条件;|效率低下;等等。 etc. |
最后我只能叹口气,选择L并挂载整个
/etc
目录。老实说,我建议你也这样做-这不值得我的时间,也不值得你的。如果您正在这样做,您可能希望在首次启动容器之前将
/etc
的内容从映像复制到主机,否则您的/etc
将只是一个空挂载。为此,您可以使用this trick。如果您使用的是
docker-compose
或podman-compose
,您可以使用变量替换将空主机目录临时挂载到/tmp/etc
(或其他任何位置),以便在执行复制时不会隐藏真实的的/etc
:个字符