【问题标题】:Using SSH keys inside docker container在 docker 容器中使用 SSH 密钥
【发布时间】:2013-08-10 18:39:52
【问题描述】:

我有一个应用程序可以使用 Git 执行各种有趣的东西(例如运行 git clone 和 git push),我正在尝试对其进行 docker 化。

我遇到了一个问题,虽然我需要能够将 SSH 密钥添加到容器以供容器“用户”使用。

我尝试将其复制到 /root/.ssh/,更改 $HOME,创建 git ssh 包装器,但仍然没有运气。

这里是 Dockerfile 供参考:

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js 运行 git 命令,例如 git pull

【问题讨论】:

  • 任何接近这个问题的人都应该考虑到最终的结果,因为如果你不小心的话,很容易造成安全漏洞并在这里忘记它。阅读所有答案并明智地选择。
  • 我有一个答案 here,使用 ssh-add,这被认为是安全的(正如 Josh Habdas 上面所说,明智地选择)。我很难让它在 Ubuntu 20.04 上运行,主要是因为调试 docker 很困难(请参阅Debugging Docker build),还因为 AppArmor 和默认情况下必须为 id_rsa 的密钥名称。

标签: ssh-keys docker


【解决方案1】:

如果您需要在构建时使用 SSH,这将是一个更难的问题。例如,如果您使用 git clone,或者在我的情况下使用 pipnpm 从私有存储库下载。

我找到的解决方案是使用--build-arg 标志添加您的密钥。然后您可以使用新的实验性--squash 命令(添加 1.13)来合并图层,以便在删除后不再可用密钥。这是我的解决方案:

构建命令

$ docker build -t example --build-arg ssh_prv_key="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)" --squash .

Dockerfile

FROM python:3.6-slim

ARG ssh_prv_key
ARG ssh_pub_key

RUN apt-get update && \
    apt-get install -y \
        git \
        openssh-server \
        libmysqlclient-dev

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
    echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && \
    chmod 600 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

# Avoid cache purge by adding requirements first
ADD ./requirements.txt /app/requirements.txt

WORKDIR /app/

RUN pip install -r requirements.txt

# Remove SSH keys
RUN rm -rf /root/.ssh/

# Add the rest of the files
ADD . .

CMD python manage.py runserver

更新:如果您使用的是 Docker 1.13 并且具有实验性功能,则可以将 --squash 附加到将合并层的构建命令中,删除 SSH 密钥并将它们隐藏在 @987654332 中@。

【讨论】:

  • This GitHub issue thread 表示这种方法仍然不安全。请参阅this comment 了解另一个类似的解决方案。
  • 另一种替代压缩的解决方案是在同一个 RUN 命令中添加和删除密钥,并在添加和删除之间根据需要使用它。
  • 也许您可以删除创建id_rsa.pub 文件的行,因为它不是必需的。
  • 不要挤压,而是使用multi stage image builds
  • 我收到Error loading key "/root/.ssh/id_rsa": invalid format。 Echo 将为我删除双引号上的换行符/附加。这仅适用于 ubuntu 还是 alpine:3.10.3 有什么不同?
【解决方案2】:

原来在使用 Ubuntu 时,ssh_config 不正确。你需要添加

RUN  echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

到您的 Dockerfile 以使其识别您的 ssh 密钥。

【讨论】:

  • 您可能还需要像这样设置正确的用户名RUN echo " Host example.com" >> /root/.ssh/config RUN echo " User <someusername>" >> /root/.ssh/config
  • 为什么有人会将私钥从主机复制到容器。命令是可以的,但我认为上述操作没有意义......
  • 这不安全!有关 Docker 的最新 1.13 版本,请参阅下面的解决方案。 @ebensing
  • @VladimirDjuricic 不过有部署密钥之类的东西。
  • 实际上你需要运行 ssh-keygen -A 在 ubuntu 最小容器上正确设置 ssh。然后您可以添加 pub/priv 密钥并启动 sshd。我的 dockerfile 中有这个条目:'RUN ssh-keygen -A' 作为步骤之一。
【解决方案3】:

注意:仅将这种方法用于私有且永远是的图像!

ssh 密钥仍存储在映像中,即使您在添加后在层命令中删除了该密钥(请参阅this post 中的 cmets)。

在我的情况下这没问题,所以这就是我正在使用的:

# Setup for ssh onto github
RUN mkdir -p /root/.ssh
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

【讨论】:

  • 这会将您的钥匙保留在图像中,不要这样做。
  • @CppLearner 你是对的,这确实将密钥存储在图像中,在某些情况下这可能是一个安全问题。感谢您强调这一点。但是,在很多情况下这是完全保存的。例如,对于存储在私有存储库中的图像,或者直接在生产服务器上构建的图像,将本地密钥复制到图像中。
  • 另外,如果您在 Dockerfile 中安装您的供应商,则在安装供应商后没有什么可以阻止您删除 ssh 密钥。
  • @SebScoFr,显然密钥将存储在其中一个层中,即使您在以后的命令中删除它们(参见更新答案中的链接)。所以镜像会一直暴露 ssh 密钥,解决方案只能用于私有镜像!
  • @yellowcap 如果你 --squash 构建则不会
【解决方案4】:

如果您使用的是docker compose,一个简单的选择是像这样转发 SSH 代理:

something:
    container_name: something
    volumes:
        - $SSH_AUTH_SOCK:/ssh-agent # Forward local machine SSH key to docker
    environment:
        SSH_AUTH_SOCK: /ssh-agent

【讨论】:

  • 请注意,这不适用于 Mac 主机,无论是使用 docker-machine(通过 VirtualBox)还是 Docker for Mac(使用 xhyve),因为没有代理 unix 域套接字。
  • SSH_AUTH_SOCK 是一个变量,其中包含一个 ssh-agent 的路径
  • ssh-forwarding 现在也支持 macOS 主机 - 您必须安装此路径 - /run/host-services/ssh-auth.sock,而不是安装 $SSH_AUTH_SOCK 的路径。
  • 这很好用!我确实必须定义像SSH_AUTH_SOCK=/ssh-agent 这样的环境变量,而不是答案中所写的。使用冒号时,我得到一个错误,即我的变量不是字符串。
【解决方案5】:

扩展 Peter Grainger's answer 我能够使用自 Docker 17.05 起可用的 multi-stage build。官方页面声明:

对于多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每条FROM 指令都可以使用不同的基础,并且它们中的每一个都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的所有内容。

记住这一点是我的Dockerfile 示例,包括三个构建阶段。它旨在创建客户端 Web 应用程序的生产映像。

# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
    echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
    printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
    yarn --pure-lockfile --mutex file --network-concurrency 1 && \
    rm -rf /root/.ssh/

# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod

# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]

.dockerignore 重复 .gitignore 文件的内容(它会阻止复制项目的 node_modules 和生成的 dist 目录):

.idea
dist
node_modules
*.log

构建镜像的命令示例:

$ docker build -t ezze/geoport:0.6.0 \
  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
  --build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
  ./

如果您的 SSH 私钥没有密码,只需指定空的 SSH_KEY_PASSPHRASE 参数。

这就是它的工作原理:

1)。在第一阶段,只有package.jsonyarn.lock 文件和私有 SSH 密钥被复制到名为sources 的第一个中间映像。为了避免进一步的 SSH 密钥密码提示,它会自动添加到 ssh-agent。最后,yarn 命令从 NPM 安装所有必需的依赖项,并通过 SSH 从 Bitbucket 克隆私有 git 存储库。

2)。第二阶段构建并缩小 Web 应用程序的源代码,并将其放置在名为 production 的下一个中间图像的 dist 目录中。请注意,安装的node_modules的源代码是从第一阶段生成的名为sources的图像中复制而来的:

COPY --from=sources /app/ /app/

也可能是下面这行:

COPY --from=sources /app/node_modules/ /app/node_modules/

我们这里只有第一个中间图像中的node_modules 目录,不再有SSH_KEYSSH_KEY_PASSPHRASE 参数。构建所需的所有其余部分都从我们的项目目录中复制。

3)。在第三阶段,我们通过仅包含名为 production 的第二个中间映像中的 dist 目录并安装 Node Express 以启动 Web 服务器来减小将标记为 ezze/geoport:0.6.0 的最终映像的大小。

列出图像给出如下输出:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ezze/geoport        0.6.0               8e8809c4e996        3 hours ago         717MB
<none>              <none>              1f6518644324        3 hours ago         1.1GB
<none>              <none>              fa00f1182917        4 hours ago         1.63GB
node                carbon              b87c2ad8344d        4 weeks ago         676MB

其中未标记的图像对应于第一个和第二个中间构建阶段。

如果你跑了

$ docker history ezze/geoport:0.6.0 --no-trunc

您不会在最终图像中看到任何提及 SSH_KEYSSH_KEY_PASSPHRASE

【讨论】:

  • 旧帖子,但我想强调这是迄今为止 18.09 之前最好的方法。壁球是不必要的,而且容易冒险。使用多阶段,您知道您只是引入了您想要的工件。将 squash 视为选择退出您不想要的文件,将多阶段视为选择加入。这个答案需要更高。在镜像中烘焙你的 ssh 密钥是一种糟糕的做法。
  • @ezze 非常感谢你这篇非常有用的帖子 :) SSH-agent 让我发疯了,我做了与你所做的类似的事情:我在 docker build logs Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) 中正确地看到了,但是当我通过执行ssh-add -l 来检查另一个 RUN 甚至是同一个 RUN 命令,它告诉我“代理没有身份”。开始扯我的头发了,有什么想法吗?
  • 不要将私钥回显到文件中 (echo "$ssh_prv_key" &gt; /root/.ssh/id_rsa)。这将破坏行格式,至少在我的情况下,请参阅stackoverflow.com/a/66648403/11154841
【解决方案6】:

为了在容器中注入 ssh 密钥,您有多种解决方案:

  1. 使用带有 ADD 指令的 Dockerfile,您可以在构建过程中注入它

  2. 只需做类似cat id_rsa | docker run -i &lt;image&gt; sh -c 'cat &gt; /root/.ssh/id_rsa'的事情

  3. 使用docker cp 命令允许您在容器运行时注入文件。

【讨论】:

  • 所以,到目前为止,我已经尝试将其复制到 /root/.ssh/id_rsa 但仍然收到来自 Git 的“主机密钥验证失败。致命:远程端意外挂断”错误,我很确定这意味着它出于任何原因都没有使用密钥。所以我在想我还需要做些什么来实际告诉系统使用它作为 ssh 密钥?不确定如何调试这个。 (我知道这个密钥有效,因为它在主机上运行时没有问题)
  • 你能确定 /etc/ssh/ssh_config 的目标是正确的密钥文件吗?
  • 有没有检查 docker 容器文件的好方法?还是我应该尝试复制一个有效的配置?
  • 我刚刚尝试使用“基本”图像,执行 apt-get install openssh-server 并将我的密钥放入 /root/.ssh/id_rsa 并且效果很好。你用的是什么图片?
  • @creack 您不能在构建步骤中使用它,因为 ADDCOPY 命令要求您的密钥驻留在构建的上下文中!
【解决方案7】:

一种跨平台解决方案是使用bind mount 将主机的.ssh 文件夹共享给容器:

docker run -v /home/<host user>/.ssh:/home/<docker user>/.ssh <image>

与代理转发类似,这种方法将使容器可以访问公钥。另一个好处是它也可以与非 root 用户一起使用,并且可以让你连接到 GitHub。然而,需要考虑的一个警告是,.ssh 文件夹中的所有内容(包括私钥)都将被共享,因此这种方法仅适用于开发并且仅适用于受信任的容器映像。

【讨论】:

  • 这可能有效,但在 docker build 期间无效,仅在 docker run 期间有效
  • 这正是重点。您不想将 ssh 密钥放在 docker 文件中。
  • 鉴于 SSH 代理转发在 Linux 之外无法正常工作,这为在开发环境中启动和运行提供了一个很好的解决方案。
  • 我在本地 Windows 10 中使用 docker-compose up 运行 docker。在这种情况下我应该如何使用您的解决方案?
  • 基本上你是在问如何在 docker compose 中映射卷。上面有一个答案回答这个问题。特别是对于 Windows,这可能会有所帮助 stackoverflow.com/questions/41334021/…
【解决方案8】:

docker API 1.39+ 开始(使用docker version 检查API 版本)docker build 允许--ssh 选项与代理套接字或密钥一起允许Docker 引擎转发SSH 代理连接。

构建命令

export DOCKER_BUILDKIT=1
docker build --ssh default=~/.ssh/id_rsa .

Dockerfile

# syntax=docker/dockerfile:experimental
FROM python:3.7

# Install ssh client (if required)
RUN apt-get update -qq
RUN apt-get install openssh-client -y

# Download public key for github.com
RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

更多信息:

【讨论】:

  • 波浪号扩展对我不起作用;我得到了:could not parse ssh: [default=~/.ssh/id_rsa]: stat ~/.ssh/id_rsa: no such file or directory。如果不起作用,请使用完整路径。
  • 但这会将 SSH 密钥本身放入映像中。对开发有用,但对生产不安全。
  • @CameronHudson 这不是真的,SSH 连接被转发到主机并且仅在构建时,SSH 密钥永远不会添加到映像中。
  • 仔细阅读后,你是对的@EdisonArango,它没有将SSH密钥放在最终图像中。但是,看起来 SSH 密钥仅在构建时可用,而不是在运行时可用。这可能适用于某些用例,但 OP 和我正在尝试在运行时使用 SSH 密钥。
  • @CameronHudson 我相信在这种情况下,您可以创建一个从主机到容器的绑定卷,然后在该卷中添加 SSH 密钥。
【解决方案9】:

Docker 容器应该被视为它们自己的“服务”。要分离关注点,您应该分离功能:

1) 数据应位于数据容器中:使用链接卷将存储库克隆到其中。然后可以将该数据容器链接到需要它的服务。

2) 使用容器运行 git 克隆任务,(即它的唯一工作是克隆)在运行时将数据容器链接到它。

3) ssh-key 也一样:把它作为一个卷(如上面建议的那样)并在需要时将其链接到 git clone 服务

这样,克隆任务和密钥都是短暂的,仅在需要时才处于活动状态。

现在,如果您的应用程序本身是一个 git 接口,您可能需要考虑直接使用 github 或 bitbucket REST API 来完成您的工作:这就是它们的设计目的。

【讨论】:

    【解决方案10】:

    将 ssh 身份验证套接字转发到容器:

    docker run --rm -ti \
            -v $SSH_AUTH_SOCK:/tmp/ssh_auth.sock \
            -e SSH_AUTH_SOCK=/tmp/ssh_auth.sock \
            -w /src \
            my_image
    

    您的脚本将能够执行git clone

    额外:如果您希望克隆的文件属于特定用户,您需要使用chown,因为在容器内使用除 root 以外的其他用户会使git 失败。

    您可以将一些附加变量发布到容器的环境中:

    docker run ...
            -e OWNER_USER=$(id -u) \
            -e OWNER_GROUP=$(id -g) \
            ...
    

    克隆后,您必须在离开容器之前执行chown $OWNER_USER:$OWNER_GROUP -R &lt;source_folder&gt; 设置正确的所有权,以便容器外的非root 用户可以访问这些文件。

    【讨论】:

    • 在较新的 Docker 版本中,您可以通过 -u root:$(id -u $USER) 至少拥有与您的用户相同的主要组拥有的文件,这应该使所有文件至少在没有 sudo 的情况下可读,除非有什么使用0600 权限创建它们。
    • @dragon788 我觉得你打错了:-u root:$(id -u $USER) 应该是 -g
    • 好电话!我似乎无法通过移动设备修复它,将很快在桌面设备上尝试。
    • 我有 /tmp/ssh_auth.sock: No such file or directory 现在它在我的主机上是 /tmp/ssh-vid8Zzi8UILE/agent.46016
    • @vladkras 错误很笼统。可能是由于容器内/tmp 的权限引起的。或者 docker run 命令上的拼写错误。确保绑定语句正确-v $SSH_AUTH_SOCK:/tmp/ssh_auth.sock:顺序很重要,分号也很重要。请查看docker documentation 以获得更多帮助。
    【解决方案11】:

    这一行有问题:

    ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa
    

    在指定要复制到映像中的文件时,您只能使用相对路径 - 相对于 Dockerfile 所在的目录。所以你应该改用:

    ADD id_rsa /root/.ssh/id_rsa
    

    并将 id_rsa 文件放入 Dockerfile 所在的同一目录中。

    查看更多详情:http://docs.docker.io/reference/builder/#add

    【讨论】:

    • 这也是一个安全问题,因为它把一个私钥放入一个容易被遗忘的图像中。
    • docker cp 只是将其放入容器而不是图像中,对吧?
    【解决方案12】:

    我们在 docker build time 执行 npm install 时遇到了类似的问题。

    Daniel van Flymen 的解决方案的启发,并将其与git url rewrite 相结合,我们找到了一种更简单的方法来验证来自私有 github 存储库的 npm install - 我们使用 oauth2 令牌而不是密钥。

    在我们的例子中,npm 依赖被指定为“git+https://github.com/...”

    对于容器中的身份验证,需要重写 url 以适合 ssh 身份验证 (ssh://git@github.com/) 或令牌身份验证 (https://${GITHUB_TOKEN}@github.com/ )

    构建命令:

    docker build -t sometag --build-arg GITHUB_TOKEN=$GITHUB_TOKEN . 
    

    不幸的是,我在 docker 1.9 上,所以 --squash 选项还没有,最终需要添加它

    Dockerfile:

    FROM node:5.10.0
    
    ARG GITHUB_TOKEN
    
    #Install dependencies
    COPY package.json ./
    
    # add rewrite rule to authenticate github user
    RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
    
    RUN npm install
    
    # remove the secret token from the git config file, remember to use --squash option for docker build, when it becomes available in docker 1.13
    RUN git config --global --unset url."https://${GITHUB_TOKEN}@github.com/".insteadOf
    
    # Expose the ports that the app uses
    EXPOSE 8000
    
    #Copy server and client code
    COPY server /server 
    COPY clients /clients
    

    【讨论】:

      【解决方案13】:

      我今天遇到了同样的问题,我发现这个方法对我更有用

      docker run -it -v ~/.ssh/id_rsa:/root/.my-key:ro image /bin/bash
      

      (请注意 readonly 标志,因此容器在任何情况下都不会弄乱我的 ssh 密钥。)

      现在我可以在容器内运行:

      ssh-agent bash -c "ssh-add ~/.my-key; git clone <gitrepourl> <target>"
      

      所以我没有得到@kross 指出的Bad owner or permissions on /root/.ssh/.. 错误

      【讨论】:

      • 谢谢!这是让它为我工作的关键:将 ssh-agent 和 ssh-add 放在一个命令中,例如:ssh-agent bash -c "ssh-add..."。然后我可以将它传递给 docker run。我发现之前的所有示例都使用了eval ssh-agent,然后是 ssh-add,但我无法找到通过 docker run 命令传递 eval 的方法。
      • 您只需挂载一个为您提供 ssh 密钥的卷,并且该卷不会保存在映像中。缺点是您有一个更复杂的run 命令(好吧,这并不重要),并且在克隆 git repo 时需要两个步骤,而自动化安装的想法是一次性完成所有操作。对于简单的想法仍然 +1。
      【解决方案14】:

      从 18.09 版本开始就可以使用了!

      根据documentation

      docker build 有一个 --ssh 选项以允许 Docker 引擎 转发 SSH 代理连接。

      以下是容器中使用 SSH 的 Dockerfile 示例:

      # syntax=docker/dockerfile:experimental
      FROM alpine
      
      # Install ssh client and git
      RUN apk add --no-cache openssh-client git
      
      # Download public key for github.com
      RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
      
      # Clone private repository
      RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject
      

      创建 Dockerfile 后,使用 --ssh 选项连接 SSH 代理:

      $ docker build --ssh default .
      

      另外,看看https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

      【讨论】:

      • Linux 用户需要启用 BuildKit 才能使用它,因为默认情况下它似乎没有启用。这可以通过在运行构建之前运行export DOCKER_BUILDKIT=1 来完成,或者通过将{ "features": { "buildkit": true } } 放入位于/etc/docker/daemon.json 的文件中来配置您的Docker 守护程序以默认启用它(至少在Ubuntu 20.04 上是这样完成的,其他发行版可能会有所不同。)文档:docs.docker.com/develop/develop-images/build_enhancements/…
      • Linux 上的另一件重要事情是,如果在您的系统上启用了 AppArmor,您需要对其进行编辑。就我而言,它会阻止访问 ssh-agent 密钥环套接字。见Go Build in Docker
      • 另见this earlier answer,虽然这个答案有一个完整的例子,可能会增加足够的价值,不会重复。
      【解决方案15】:

      您可以使用多阶段构建来构建容器 这是您可以采取的方法:-

      第 1 阶段使用 ssh 构建映像

      FROM ubuntu as sshImage
      LABEL stage=sshImage
      ARG SSH_PRIVATE_KEY
      WORKDIR /root/temp
      
      RUN apt-get update && \
          apt-get install -y git npm 
      
      RUN mkdir /root/.ssh/ &&\
          echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa &&\
          chmod 600 /root/.ssh/id_rsa &&\
          touch /root/.ssh/known_hosts &&\
          ssh-keyscan github.com >> /root/.ssh/known_hosts
      
      COPY package*.json ./
      
      RUN npm install
      
      RUN cp -R node_modules prod_node_modules
      

      第 2 阶段:构建您的容器

      FROM node:10-alpine
      
      RUN mkdir -p /usr/app
      
      WORKDIR /usr/app
      
      COPY ./ ./
      
      COPY --from=sshImage /root/temp/prod_node_modules ./node_modules
      
      EXPOSE 3006
      
      CMD ["npm", "run", "dev"] 
      

      在您的撰写文件中添加 env 属性:

         environment:
            - SSH_PRIVATE_KEY=${SSH_PRIVATE_KEY}
      

      然后像这样从构建脚本传递参数:

      docker-compose build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
      

      并移除中间容器以确保安全。 这将帮助你欢呼。

      【讨论】:

      • @CameronHudson 您的评论有误,此答案使用COPY --from=sshImage 命令仅将所选文件夹从临时图像复制到新图像。其他任何东西,这意味着 ssh 密钥也被留下,临时图像在“多阶段构建”中被自动删除。因此,这个例子是安全的。我发现它太晚了,现在有一种duplicated answer,也许它至少可以作为另一个例子。
      【解决方案16】:

      正如 eczajk 已经在 Daniel van Flymen 的回答中评论的那样,删除密钥并使用 --squash 似乎并不安全,因为它们仍然会在历史记录中可见 (docker history --no-trunc)。

      现在,您可以使用“构建机密”功能,而不是 Docker 18.09。在我的情况下,我使用我的主机 SSH 密钥克隆了一个私有 git repo,并在我的 Dockerfile 中包含以下内容:

      # syntax=docker/dockerfile:experimental
      
      [...]
      
      RUN --mount=type=ssh git clone [...]
      
      [...]
      

      为了能够使用它,您需要在运行 docker build 之前启用新的 BuildKit 后端:

      export DOCKER_BUILDKIT=1
      

      并且你需要将--ssh default参数添加到docker build

      在此处了解更多信息:https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

      【讨论】:

      • 最佳解决方案恕我直言。我必须做两件事才能让它工作:1)使用ssh-add ~/.ssh/id_rsa将我的私钥添加到ssh-agent和2)将git主机添加到known_hosts,即对于bitbucket:RUN ssh-keyscan -H bitbucket.org &gt;&gt; ~/.ssh/known_hosts
      • 我根本无法让它工作。我仍然收到权限错误:Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access and the repository exists. 尽管在我的 docker 构建中传递了--ssh default 标志,并且在我git clone 的运行命令中使用了--mount=type=ssh。我能够在构建机器上克隆相同的 repo 没问题。它只是在 docker build 容器中失败。我怀疑 Docker 的 mac 版本实际上并没有传递 ssh 客户端。
      • @PMende 你能弄清楚你提到的这个问题吗,因为我也面临同样的问题。
      • @SadanArshad 事实证明,目前只有在 Linux 机器上运行 Docker 时才支持此功能。如果您是从 Mac 上运行 Docker 命令(可能还有 Windows,尽管我无法确认),它就不起作用。
      • 太糟糕了,不能使用 docker-compose...github.com/docker/compose/issues/6440
      【解决方案17】:

      这个问题真的很烦人。由于您无法在 dockerfile 上下文之外添加/复制任何文件,这意味着无法仅将 ~/.ssh/id_rsa 链接到图像的 /root/.ssh/id_rsa 中,并且当您肯定需要密钥来做一些 sshed 事情时就像来自私人仓库链接的 git clone ...,在构建 docker 映像期间。

      无论如何,我找到了一个解决方法,虽然不是那么有说服力,但确实对我有用。

      1. 在您的 dockerfile 中:

        • 将此文件添加为 /root/.ssh/id_rsa
        • 随心所欲,如 git clone、composer...
        • rm /root/.ssh/id_rsa 结尾
      2. 一次性完成的脚本:

        • cp 保存 dockerfile 的文件夹的密钥
        • docker 构建
        • rm 复制的密钥
      3. 任何时候你必须从这个镜像运行一个容器并且有一些 ssh 要求,只需在运行命令中添加 -v,比如:

        docker run -v ~/.ssh/id_rsa:/root/.ssh/id_rsa --name 容器镜像命令

      此解决方案导致您的项目源和构建的 docker 映像中没有私钥,因此无需担心安全问题。

      【讨论】:

      • “由于你不能在 dockerfile 上下文之外添加/复制任何文件,” 你见过docker cp吗?它用于“在容器和主机之间复制文件/文件夹。”
      • @JonathonReinhart,感谢您指出这一点。是的,docker cp 可以做到这一点。但是在这种情况下,我在构建映像期间需要 ssh_key,并且当时没有容器...将更新我不清楚的表达,无论如何谢谢。
      【解决方案18】:

      '您可以有选择地让远程服务器访问您的本地 ssh-agent,就像它在服务器上运行一样'

      https://developer.github.com/guides/using-ssh-agent-forwarding/

      【讨论】:

      • docker run -i -t -v $(readlink -f $SSH_AUTH_SOCK):/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent ubuntu /bin/bash
      • fruitl00p 以这种方式创建了一个 docker-tunnel 容器:github.com/kingsquare/docker-tunnel
      【解决方案19】:

      您也可以在主机和容器之间链接您的 .ssh 目录,我不知道这种方法是否有任何安全隐患,但它可能是最简单的方法。像这样的东西应该可以工作:

      $ sudo docker run -it -v /root/.ssh:/root/.ssh someimage bash
      

      请记住,docker 使用 sudo 运行(除非您不这样做),如果是这种情况,您将使用根 ssh 密钥。

      【讨论】:

      • 使用这个方法适用于 docker 0.11,但是如果你使用 fig,它会抛出一个 panic 错误。我不知道为什么
      • 这将是一种首选方法,诀窍是使用我的非特权主机用户的密钥作为容器的根。正如您所提到的,尝试不以主机 root 用户身份执行此操作会产生 Bad owner or permissions on /root/.ssh/config
      • 这只能在docker run期间使用,而不能在docker build期间使用。
      • @ccpizza ,我认为这是一个优势。其中许多答案都将私钥存储在图像中;即使在后续层命令中删除密钥后,该密钥仍会存储。通过只在运行(而不是构建)期间引入私钥,它们只能存在于容器(而不是镜像)中。
      【解决方案20】:

      关于 Docker 容器中的 SSH 挑战的简要概述是 detailed here。为了在不泄露机密的情况下从容器内连接到受信任的遥控器,有几种方法:

      除此之外,还可以使用在使用 Compose 时在运行时可访问的单独 docker 容器中运行的密钥库。这里的缺点是额外的复杂性,因为创建和管理密钥库(例如 Vault by HashiCorp)所需的机制。

      对于在独立 Docker 容器中使用 SSH 密钥,请参阅上面链接的方法,并根据您的具体需求考虑每种方法的缺点。但是,如果您在 Compose 中运行并希望在运行时共享应用程序的密钥(反映 OP 的实用性),请尝试以下操作:

      • 创建一个docker-compose.env 文件并将其添加到您的.gitignore 文件中。
      • 更新您的 docker-compose.yml 并添加 env_file 以获取需要密钥的服务。
      • 在应用程序运行时从环境访问公钥,例如process.node.DEPLOYER_RSA_PUBKEY 对于 Node.js 应用程序。

      上述方法非常适合开发和测试,虽然它可以满足生产要求,但在生产中最好使用上面确定的其他方法之一。

      其他资源:

      【讨论】:

      • 感谢总结!
      【解决方案21】:

      如果您不关心 SSH 密钥的安全性,这里有很多很好的答案。如果你这样做了,我发现的最佳答案是从上面评论中的链接到this GitHub commentdiegocsandrim。为了让其他人更有可能看到它,并且以防该 repo 消失,这里是该答案的编辑版本:

      这里的大多数解决方案最终都会将私钥留在映像中。这很糟糕,因为任何有权访问图像的人都可以访问您的私钥。由于我们对squash 的行为知之甚少,因此即使您删除密钥并挤压该层,情况仍可能如此。

      我们生成一个预签名 URL 来使用 aws s3 cli 访问密钥,并限制访问大约 5 分钟,我们将此预签名 URL 保存到 repo 目录中的文件中,然后在 dockerfile 中将其添加到图片。

      在 dockerfile 中,我们有一个 RUN 命令来执行所有这些步骤:使用预唱 URL 获取 ssh 密钥,运行 npm install,然后删除 ssh 密钥。

      通过在单个命令中执行此操作,ssh 密钥将不会存储在任何层中,但会存储预签名 URL,这不是问题,因为 URL 在 5 分钟后将失效。

      构建脚本如下所示:

      # build.sh
      aws s3 presign s3://my_bucket/my_key --expires-in 300 > ./pre_sign_url
      docker build -t my-service .
      

      Dockerfile 看起来像这样:

      FROM node
      
      COPY . .
      
      RUN eval "$(ssh-agent -s)" && \
          wget -i ./pre_sign_url -q -O - > ./my_key && \
          chmod 700 ./my_key && \
          ssh-add ./my_key && \
          ssh -o StrictHostKeyChecking=no git@github.com || true && \
          npm install --production && \
          rm ./my_key && \
          rm -rf ~/.ssh/*
      
      ENTRYPOINT ["npm", "run"]
      
      CMD ["start"]
      

      【讨论】:

      • 这个方案的问题是因为pre_sign_url每次都会变化,所以即使packages.json文件没有变化也无法缓存npm install。最好在 build.sh 中获取 key 并将其设置为构建参数,这样就不会每次都改变了
      【解决方案22】:

      在不将密钥保存在 Docker 映像层或通过 ssh_agent 体操的情况下实现此目的的一种简单且安全的方法是:

      1. 作为Dockerfile 中的步骤之一,通过添加以下内容创建.ssh 目录:

        RUN mkdir -p /root/.ssh

      2. 以下表示您希望将 ssh 目录挂载为卷:

        VOLUME [ "/root/.ssh" ]

      3. 通过添加以下行确保您的容器的 ssh_config 知道在哪里可以找到公钥:

        RUN echo " IdentityFile /root/.ssh/id_rsa" &gt;&gt; /etc/ssh/ssh_config

      4. 在运行时将本地用户的.ssh 目录暴露给容器:

        docker run -v ~/.ssh:/root/.ssh -it image_name

        或者在您的dockerCompose.yml 中添加此服务的音量键:

        - "~/.ssh:/root/.ssh"

      您的最终Dockerfile 应包含以下内容:

      FROM node:6.9.1
      
      RUN mkdir -p /root/.ssh
      RUN  echo "    IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config
      
      VOLUME [ "/root/.ssh" ]
      
      EXPOSE 3000
      
      CMD [ "launch" ]
      

      【讨论】:

        【解决方案23】:

        我整理了一个非常简单的解决方案,适用于我的用例,我使用“构建器”docker 映像来构建单独部署的可执行文件。换句话说,我的“构建器”映像永远不会离开我的本地计算机,并且只需要在构建阶段访问私有存储库/依赖项。

        您无需为此解决方案更改 Dockerfile。

        当您运行容器时,挂载您的 ~/.ssh 目录(这样可以避免将密钥直接烘焙到映像中,而是确保它们在构建过程中的短时间内仅可用于单个容器实例阶段)。就我而言,我有几个构建脚本可以自动化我的部署。

        在我的 build-and-package.sh 脚本中,我像这样运行容器:

        # 之前做一些脚本的东西 ... 码头运行--rm \ -v ~/.ssh:/root/.ssh \ -v "$workspace":/工作空间\ -w /工作区构建器\ bash -cl "./scripts/build-init.sh $executable" ... # 之后做一些脚本的事情(即将构建的可执行文件拉出工作区等)

        build-init.sh 脚本如下所示:

        #!/bin/bash
        
        set -eu
        
        executable=$1
        
        # start the ssh agent
        eval $(ssh-agent) > /dev/null
        
        # add the ssh key (ssh key should not have a passphrase)
        ssh-add /root/.ssh/id_rsa
        
        # execute the build command
        swift build --product $executable -c release
        

        因此,我们不是直接在docker run 命令中执行swift build 命令(或任何与您的环境相关的构建命令),而是执行启动ssh-agentbuild-init.sh 脚​​本,然后添加我们的ssh密钥,最后执行我们的swift build 命令。

        注意 1:为此,您需要确保您的 ssh 密钥没有密码,否则 ssh-add /root/.ssh/id_rsa 行将要求输入密码并中断构建脚本。

        注意 2:确保您对脚本文件设置了正确的文件权限,以便它们可以运行。

        希望这能为其他有类似用例的人提供一个简单的解决方案。

        【讨论】:

        • docker run .... -v ~/.ssh:/root/.ssh 部分对我有用
        【解决方案24】:

        起初,一些元噪音

        这里有两个高度赞成的答案中有一个危险的错误建议

        我发表了评论,但由于我为此浪费了很多天,请注意:

        不要将私钥回显到文件中(意思是:echo "$ssh_prv_key" &gt; /root/.ssh/id_ed25519)。至少在我的情况下,这将破坏所需的行格式。

        请改用COPYADD。详情请见Docker Load key “/root/.ssh/id_rsa”: invalid format

        另一位用户也确认了这一点:

        我收到错误加载密钥“/root/.ssh/id_ed25519”:格式无效。回声会 为我删除换行符/双引号。这是否仅适用于 ubuntu 还是 alpine:3.10.3 有什么不同?


        1。一种将私钥保存在映像中的工作方式(不太好!)

        如果镜像中存储了私钥,需要注意从git网站删除公钥,或者不要发布镜像。如果你照顾好这个,这是安全的。请参阅下面的 (2.) 以了解更好的方法,您也可以“忘记关注”。

        Dockerfile 如下所示:

        FROM ubuntu:latest
        RUN apt-get update && apt-get install -y git
        RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
        COPY /.ssh/id_ed25519 /root/.ssh/id_ed25519
        RUN chmod 600 /root/.ssh/id_ed25519 && \
            apt-get -yqq install openssh-client && \
            ssh-keyscan -t ed25519 -H gitlab.com >> /root/.ssh/known_hosts
        RUN git clone git@gitlab.com:GITLAB_USERNAME/test.git
        RUN rm -r /root/.ssh
        

        2。一种不将私钥保留在图像中的工作方式(好!)

        以下是同一件事的更安全的方法,改为使用“多阶段构建”。 如果您需要具有 git repo 目录的图像其中一个层中没有存储私钥,则需要两个图像,最后只使用第二个。也就是说,你需要两次FROM,然后你可以copy only the git repo directory from the first to the second image,见official guide "Use multi-stage builds"

        我们使用“alpine”作为最小的基础镜像,它使用apk 而不是apt-get;您也可以在上面的代码中使用apt-get,而不是使用FROM ubuntu:latest

        Dockerfile 如下所示:

        # first image only to download the git repo
        FROM alpine as MY_TMP_GIT_IMAGE
        
        RUN apk add --no-cache git
        RUN mkdir -p /root/.ssh &&  chmod 700 /root/.ssh
        COPY /.ssh/id_ed25519 /root/.ssh/id_ed25519
        RUN chmod 600 /root/.ssh/id_ed25519
        
        RUN apk -yqq add --no-cache openssh-client && ssh-keyscan -t ed25519 -H gitlab.com >> /root/.ssh/known_hosts
        RUN git clone git@gitlab.com:GITLAB_USERNAME/test.git
        RUN rm -r /root/.ssh
        
        
        # Start of the second image
        FROM MY_BASE_IMAGE
        COPY --from=MY_TMP_GIT_IMAGE /MY_GIT_REPO ./MY_GIT_REPO
        

        我们在这里看到FROM 只是一个名称空间,它就像它下面的行的标题,可以用别名来寻址。如果没有别名,--from=0 将是第一个图像(=FROM 命名空间)。

        您现在可以发布或共享第二张图片,因为私钥不在其层中,并且您不必在使用一次后从 git 网站中删除公钥! 因此,您不需要在每次克隆存储库时创建新的密钥对。当然,请注意,如果有人可能以另一种方式获取您的数据,那么无密码的私钥仍然是不安全的。 如果您对此不确定,最好在使用后从服务器中删除公钥,并在每次运行时使用新的密钥对。


        如何从 Dockerfile 构建镜像的指南

        • 安装 Docker 桌面;或者在 VirtualBox 中使用 WSL2 或 Linux 中的 docker;或者在独立的 Linux 分区/硬盘中使用 docker。

        • 打开命令提示符(PowerShell、终端等)。

        • 进入 Dockerfile 的目录。

        • 创建一个子文件夹“.ssh/”。

        • 出于安全原因,为 每个 Dockerfile 运行创建一个 公有和私有 SSH 密钥对 - 即使您已经有另一个密钥对。在命令提示符下,在 Dockerfile 的文件夹中,输入(注意,这会覆盖而不询问):

            Write-Output "y" | ssh-keygen -q -t ed25519 -f ./.ssh/id_ed25519 -N '""'
          

          (如果您使用 PowerShell)或

            echo "y" | ssh-keygen -q -t ed25519 -f ./.ssh/id_ed25519 -N ''
          

          (如果您不使用 PowerShell)。

          您的密钥对现在将位于子文件夹 .ssh/ 中。是否使用该子文件夹取决于您,您也可以将代码更改为COPY id_ed25519 /root/.ssh/id_ed25519;那么你的私钥需要在你所在的 Dockerfile 目录中。

        • 在编辑器中打开公钥,复制内容并将其发布到您的服务器(例如 GitHub / GitLab --> 个人资料 --> SSH 密钥)。您可以选择任何名称和结束日期。公钥字符串的最终可读注释(如果您没有在ssh-keygen 的参数中添加-C 注释,通常是您的计算机名称)并不重要,只需将其留在那里即可。

        • 开始(不要忘记末尾的“.”,它是构建上下文):

          docker build -t 测试。

        仅适用于 1.):

        • 运行后,从服务器中删除公钥(最重要,最多一次)。该脚本会从映像中删除私钥,您也可以从本地计算机中删除私钥,因为您不应再次使用该密钥对。原因:有人可以get the private key from the image even if it was removed from the image。引用a user's评论:

          如果有人掌握了你的 图像,他们可以检索密钥...即使您删除该文件 后面的层,b/c 当你添加它时,他们可以回到第 7 步

          攻击者可以使用此私钥等待,直到您再次使用该密钥对。

        仅适用于 2.):

        • 运行后,由于第二个映像是构建后唯一剩余的映像,因此我们不一定需要从客户端和主机中删除密钥对。我们仍然有一个小风险,即无密码私钥是从某处的本地计算机获取的。这就是为什么您仍然可以从 git 服务器中删除公钥的原因。您还可以删除任何存储的私钥。但在许多主要目标是自动构建映像而不是安全性的项目中可能不需要它。

        最后,再来点元噪音

        至于此处两个高度赞成的答案中的危险错误建议,它们使用了有问题的私钥回声方法,以下是撰写本文时的投票: p>

        我们在这里看到,答案肯定有问题,因为前 1 名的答案投票至少不是问题投票的水平。

        在前 1 个答案的评论列表末尾只有一个小的且未投票的评论,命名相同的私钥回显问题(此答案中也引用了该问题)。并且:这个批评性评论是在回答三年后发表的。

        我自己投票选出了前 1 个答案。我后来才意识到它对我不起作用。因此,群体智能正在发挥作用,但在低火上?如果有人可以向我解释为什么回显私钥可能对其他人有用,但对我无效,请发表评论。否则,326k 视图(减去 2 cmets ;))会忽略或忽略前 1 个答案的错误。 如果那个回显私钥代码行不会花费我很多工作日,我不会在这里写这么长的文本,而且从网上的所有东西中挑选代码绝对令人沮丧。

        【讨论】:

          【解决方案25】:

          在更高版本的 docker (17.05) 中,您可以使用multi stage builds。这是最安全的选择,因为以前的构建只能由后续构建使用,然后被销毁

          更多信息请见the answer to my stackoverflow question

          【讨论】:

          • 这似乎是最好的答案,因为它是最安全的。我没有测试过,但听起来很明显。如果您不想将密钥存储在图像的图层中,则链接显示:只需从旧图像构建新图像并仅接管您需要的层(没有关键层) - 并删除旧的图片。该链接似乎很有希望。
          • 如果您使用docs.docker.com/develop/develop-images/build_enhancements/…,现在@questionto42 实际上有一个更好的答案
          • 也许您可能会花时间在这里添加一个示例的第二个答案?这应该在这个线程中作为一个答案被提及,而不仅仅是一个很好的旁注:)。在这个长线程中,不单击就看不到 cmets。而且很多人不会阅读cmets。不管怎样,谢谢你的分享。
          • @questionto42 这个问题的答案太多了。即使我改变它也不会被注意到
          • 不会这么说,我在五天内看到了两次对新答案的赞成票,这表明投票率低的答案被阅读,因为最高票数不够好(前 1 名只是一半问题投票)。我宁愿说,即使您在这里展示了有关安全性的最佳方法,它也不能回答如何最终 ssh 进入服务器的问题。最安全的设置不是问题的核心,知道就好。
          【解决方案26】:

          我正在尝试以另一种方式解决问题:将公共 ssh 密钥添加到图像。但在我的试验中,我发现“docker cp”用于从容器复制到主机。 creak 的回答中的第 3 项似乎是说您可以使用 docker cp 将文件注入容器。见https://docs.docker.com/engine/reference/commandline/cp/

          摘录

          将文件/文件夹从容器的文件系统复制到主机路径。 路径是相对于文件系统的根目录的。

            Usage: docker cp CONTAINER:PATH HOSTPATH
          
            Copy files/folders from the PATH to the HOSTPATH
          

          【讨论】:

          • 此 URL 现在似乎已损坏。
          • 这是过时的或不正确的。它可以复制任一方向,最迟 1.8.2。
          【解决方案27】:

          您可以使用共享文件夹将授权密钥传递到您的容器中,并使用 docker 文件设置权限,如下所示:

          FROM ubuntu:16.04
          RUN apt-get install -y openssh-server
          RUN mkdir /var/run/sshd
          EXPOSE 22
          RUN cp /root/auth/id_rsa.pub /root/.ssh/authorized_keys
          RUN rm -f /root/auth
          RUN chmod 700 /root/.ssh
          RUN chmod 400 /root/.ssh/authorized_keys
          RUN chown root. /root/.ssh/authorized_keys
          CMD /usr/sbin/sshd -D
          

          您的 docker run 包含类似以下内容,用于与容器共享主机上的 auth 目录(保存授权密钥),然后打开可通过主机上的端口 7001 访问的 ssh 端口。

          -d -v /home/thatsme/dockerfiles/auth:/root/auth -–publish=127.0.0.1:7001:22
          

          您可能想查看https://github.com/jpetazzo/nsenter,这似乎是在容器上打开外壳并在容器内执行命令的另一种方式。

          【讨论】:

            【解决方案28】:

            诚然,聚会迟到了,这样可以让您的主机操作系统密钥在容器内即时可用:

            docker run -v ~/.ssh:/mnt -it my_image /bin/bash -c "ln -s /mnt /root/.ssh; ssh user@10.20.30.40"
            

            我不赞成使用 Dockerfile 来安装密钥,因为容器的迭代可能会留下私钥。

            【讨论】:

              【解决方案29】:

              就我而言,我遇到了来自远程存储库的 nodejs 和“npm i”问题。我修复了它在 nodejs 容器中添加了“节点”用户,在容器中添加了 700 到 ~/.ssh。

              Dockerfile:

              USER node #added the part
              COPY run.sh /usr/local/bin/
              CMD ["run.sh"]
              

              run.sh:

              #!/bin/bash
              chmod 700 -R ~/.ssh/; #added the part
              

              docker-compose.yml:

              nodejs:
                    build: ./nodejs/10/
                    container_name: nodejs
                    restart: always
                    ports:
                      - "3000:3000"
                    volumes:
                      - ../www/:/var/www/html/:delegated
                      - ./ssh:/home/node/.ssh #added the part
                    links:
                      - mailhog
                    networks:
                      - work-network
              

              之后就开始工作了

              【讨论】:

                【解决方案30】:

                这是我在使用 docker composer 构建映像期间使用 ssh 密钥的方法:

                .env

                SSH_PRIVATE_KEY=[base64 encoded sshkey]
                

                docker-compose.yml

                version: '3'
                services:
                  incatech_crawler:
                    build:
                      context: ./
                      dockerfile: Dockerfile
                      args:
                        SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY} 
                

                码头文件: ...

                # Set the working directory to /app
                WORKDIR /usr/src/app/
                ARG SSH_PRIVATE_KEY 
                 
                RUN mkdir /root/.ssh/  
                RUN echo -n ${SSH_PRIVATE_KEY} | base64 --decode > /root/.ssh/id_rsa_wakay_user
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-05-21
                  • 2020-12-27
                  • 2021-08-20
                  • 1970-01-01
                  • 2022-10-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多