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 文件中使用 git
或 ssh
命令。由于您已经有了 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
的文件会妨碍您的工作;在主机上克隆存储库很容易允许这两种情况。
我正在尝试将 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 文件中使用 git
或 ssh
命令。由于您已经有了 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
的文件会妨碍您的工作;在主机上克隆存储库很容易允许这两种情况。