在Docker容器中持久化/etc/passwd文件

6
我创建了一个Docker镜像,允许用户通过SSH连接。出于安全考虑,我希望用户能够更改密码。由于我只使用Docker命名卷,所以无法绑定/etc/passwd并且我不想挂载所有的/etc。有什么好的建议吗?谢谢。

为什么不在容器中设置一个默认密码,让用户连接后再更改呢?(或者您可以在Dockerfile中添加myfolder/passwd /etc/passwd - 但是这样需要小心处理此文件 - 或者只需创建一个在启动时运行并从另一个路径读取密码并更改passwd的脚本即可) - Edwin
1
是的,用户在使用ssh登录后会更改他们的密码。但是如果我重建镜像或重新启动(而不是恢复)容器,则所有密码都将丢失。因此,我可以保存/etc/passwd文件并在之后进行恢复,但我不喜欢这种方式。有没有更干净的方法? - lama02
尝试这个:https://docs.docker.com/engine/swarm/secrets/#read-more-about-docker-secret-commands - Edwin
谢谢,我认为这是正确的做法。但对于我的使用来说似乎太不成比例了。我找到了一个解决方案,请看我的问题回答。 - lama02
这与编程无关,应该在[su]上。 - phuclv
2个回答

5

最后我找到了这个解决方案:

  • 创建一个命名卷
  • 将其挂载(例如在/users下)
  • 在其中设置影子文件
  • 在容器启动时,将/users/shadow链接到/etc/shadow

0
在这个问题中,有人问是否可以使用docker compose将文件挂载为卷(答案是肯定的),所以如果使用compose可以做到,我认为使用docker也是可以的。 我知道这与您的问题不同,因为他们使用主机目录/文件,但是docker命名卷(如您可以在此处看到的那样)用于使容器独立于主机,这是通过创建一些由docker处理的卷来完成的。
因此,请尝试创建一个卷并将该卷挂载到passwd文件的位置。

1
谢谢。但我相信以“/”开头的卷语法是用于Docker主机绑定挂载,而不是Docker命名卷。执行以下操作:docker volume create passwd && docker container run -ti --mount source=passwd,target=/etc/passwd alpine会失败,并显示以下错误信息:docker: Error response from daemon: readdirent: not a directory. - lama02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接