3

我正在尝试构建一个 docker 映像,我有包含所有必要命令的 dockerfile。但在我的构建步骤中,我需要将一个目录从远程主机复制到 docker 映像。但是,如果我将 scp 命令放入 dockerfile,我还必须在 dockerfile 中提供密码,而我不必这样做。

任何人都有更好的解决方案来做到这一点。任何建议将不胜感激。

4

2 回答 2

3

我想说至少有处理这个问题的选择:

选项 1: 如果您可以scp在运行之前执行,docker build这可能是最简单的选项:

  1. scp -r somewhere:remote_dir ./local_dir
  2. 添加COPY ./local_dir some_path到您的 Dockerfile
  3. docker build

选项 2:如果您必须scp在构建期间执行:

  1. 在构建之前启动一些键值存储,例如etcd
  2. 将正确的 SSH 密钥(不能受密码保护)临时放在键值存储中
  3. 在单个RUN命令中(避免在图像中留下秘密):
    • 从键值存储中检索 SSH 密钥;
    • 将其放入~/.ssh/id_rsa或启动ssh-agent并添加它;
    • 检索目录scp
    • 删除 SSH 密钥
  4. 从键值存储中删除键

第二个选项有点复杂,因此可能值得创建一个包装脚本来检索所需的机密、运行任何命令并删除机密。

于 2016-07-06T18:48:49.250 回答
1

您可以在构建后将目录复制到(甚至正在运行的)容器中

  1. 在远程机器上:从远程主机复制到 docker 主机

    scp -r /your/dir/ <user-at-docker-host>@<docker-host>:/some/remote/directory

  2. 在 docker 机器上:从 docker 主机复制到 docker 容器

    docker cp /some/remote/directory <container-name>:/some/dir/within/docker/

当然,如果您愿意,您也可以通过简单地调整scp命令的目标来从您的 docker 机器上执行第 1 步。

于 2018-02-20T15:12:46.213 回答