id_rsa 使用 Makefile 时 Dockerfile 中的格式无效

id_rsa invalid format in Dockerfile when using Makefile

我正在尝试将 SSH 密钥传递到 Dockerfile 中,以便我可以从 Git.

中提取私有存储库

当我在命令行上使用它时它有效

export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
docker build --build-arg SSH_PRIVATE_KEY  --tag image:latest .

下面是我的 Dockerfile 的片段

ARG SSH_PRIVATE_KEY

RUN apt-get update && apt-get install -y git && apt-get install -y nano && \
    apt-get update && apt-get install -y python3.7 python3-pip python3.7-dev && \
    rm -rf /var/lib/apt/lists/*

RUN mkdir -p ~/.ssh && umask 0077 && echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa \
    && git config --global url."git@github.com:".insteadOf https://github.com/ \
    && ssh-keyscan github.com >> ~/.ssh/known_hosts

然而,当我尝试 运行 它来自像这样的 makefile 时

SSH_PRIVATE_KEY=$(shell cat ~/.ssh/id_rsa)


build-image:
    docker build --build-arg SSH_PRIVATE_KEY="${SSH_PRIVATE_KEY}" --tag image:latest -f ./docker/Dockerfile .

我收到错误

Load key "/root/.ssh/id_rsa": invalid format

我在这里做错了什么吗?

谢谢!

避免 运行在 Docker 文件中使用 gitssh 命令。由于您已经有了 Makefile,因此在主机构建环境中克隆存储库非常简单:

# (not .PHONY, this actually creates the file)
some_dependency/some_file:
        git clone git@github.com:some_organization/some_dependency

build-image: some_dependency/some_file
        docker build --tag image:latest -f ./docker/Dockerfile .

您应该避免 运行ning ssh 因为安全地管理私钥基本上是不可能的。在您的示例中,任何获得您图像副本的人都可以轻松

docker run --rm image:latest cat .ssh/id_rsa

现在你的私钥被泄露了。

在 Docker 文件中反对 git clone 的论点有点微妙。 Docker 的层缓存意味着它将尝试避免重新运行 已经是 运行 的命令。这意味着如果您之前在此主机上构建过此映像,则重新 运行ning docker build 将使用与之前相同的签出;它不会重复 git clone 并且您将停留在旧版本上。这也意味着在不同的主机上构建相同的镜像会得到不同的结果,这取决于镜像的第一次构建时间。

在您的同事正在处理的私有存储库的上下文中,还请考虑您需要针对拉取请求或其他分支构建测试映像的情况,或者您实际需要针对其中测试本地更改的情况那种依赖。 Docker 文件中的 git clone 专门用于 master 的文件会妨碍您的工作;在主机上克隆存储库很容易允许这两种情况。