【问题标题】:SSH keys not being created in Docker image未在 Docker 映像中创建 SSH 密钥
【发布时间】:2017-12-16 00:34:21
【问题描述】:

第一次使用 Docker 进行实验。在构建容器时尝试创建 ssh 密钥。构建输出显示它们已创建,但我没有在 /root/.ssh 中的预期位置看到它们。我做错了什么?

FROM ubuntu
MAINTAINER AfterWorkGuinness
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir /root/.ssh
RUN cd /root/.ssh
RUN ssh-keygen -t rsa -N "" -f id_rsa
EXPOSE 22

构建输出:

Step 5/7 : RUN mkdir /root/.ssh
 ---> Running in 373406b5976a
 ---> acb1b7b1a8c0
Removing intermediate container 373406b5976a
Step 6/7 : RUN ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
 ---> Running in 36ee488a98bd
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bnm79N/fHIwcbFAH/obiP3nFFPevdo25kECvQzNXfq8 root@36ee488a98bd
The key's randomart image is:
+---[RSA 2048]----+
|             o.. |
|            o ...|
|          .. .. +|
|         . .ooo o|
|        S =.o=.=o|
|       . o.*+.=.=|
|        + =.oo.*+|
|       . o +.+===|
|          o..+Eo*|
+----[SHA256]-----+
 ---> d3f23fbf9240
Removing intermediate container 36ee488a98bd
Step 7/7 : EXPOSE 22
 ---> Running in 1381315dad22
 ---> 50e5e6337ee6
Removing intermediate container 1381315dad22
Successfully built 50e5e6337ee6

运行容器:

docker run -it -v localTmp:/root ubuntu-ssh

目录为空

root@09904a84f312:~/.ssh# cd /root/.ssh
root@09904a84f312:~/.ssh# ls
root@09904a84f312:~/.ssh#

【问题讨论】:

  • 为什么要将 localTmp 卷挂载到生成文件的 /root 上?
  • 我不希望在容器重新启动时擦除密钥。我认为这是确保主目录 (/root) 的内容(例如 ssh 目录和在构建中创建的密钥在容器重启后仍然存在)的方法。这是错的吗?
  • 卷将存储安装在路径上,这实际上会导致卷中发生任何 I/O。如果您删除 -v 选项,您会看到您期望的文件吗?
  • 没有文件,但 /root/.ssh 目录仍然存在。
  • 如果文件不存在,那么我会说生成它们时出现问题。在构建期间创建的文件将在容器中。

标签: docker ssh


【解决方案1】:

我看到你在Docker doesn't create directory during build 中询问了这个问题的第一部分,并且你已经尝试使用命名卷而不是绑定挂载来解决这个问题。绑定挂载和命名卷之间的唯一区别是 如果 命名卷为空,Docker 会将您要挂载的任何内容复制到其中。如果命名卷中包含任何内容(例如,因为您之前曾使用它来测试过),您将不会看到该复制行为。

但老实说,这一切都不是重点:您应该在 run 时而不是在 build 时生成 ssh 密钥。在极少数情况下,您实际上希望从该映像部署的每个容器都具有相同的 ssh 密钥。

如果您真的想要一堆容器使用相同的 ssh 密钥,那么在构建时继续生成密钥,但将它们放在文件系统的其他位置,然后将它们复制到 /root/.ssh在运行时。

在上面,几乎每次我说“在运行时”时,我都建议使用ENTRYPOINT 脚本。你可以阅读更多关于here的信息。

【讨论】:

  • 相信你是在提倡这个:link
猜你喜欢
  • 2014-01-20
  • 2017-11-02
  • 2021-02-07
  • 1970-01-01
  • 2019-02-22
  • 2018-09-19
  • 1970-01-01
  • 2014-09-13
  • 2018-08-19
相关资源
最近更新 更多