gpt4 book ai didi

docker - 在 DC/OS 的 docker 容器内运行时,ssh-agent 不记得身份

转载 作者:IT老高 更新时间:2023-10-28 21:24:09 24 4
gpt4 key购买 nike

我正在尝试使用 DC/OS 和 Docker 运行服务。我使用来自 here 的我所在区域的模板创建了我的堆栈。我还创建了以下 Dockerfile:

FROM ubuntu:16.04
RUN apt-get update && apt-get install -y expect openssh-client

WORKDIR "/root"
ENTRYPOINT eval "$(ssh-agent -s)" && \
mkdir -p .ssh && \
echo $PRIVATE_KEY > .ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa && \
expect -c "spawn ssh-add /root/.ssh/id_rsa; expect \"Enter passphrase for /root/.ssh/id_rsa:\" send \"\"; interact " && \
while true; do ssh-add -l; sleep 2; done

我有一个私有(private)存储库,我想在 docker 容器启动时克隆/拉取它。这就是我尝试将私钥添加到 ssh-agent 的原因。

如果我将此镜像作为本地 docker 容器运行并使用 PRIVATE_KEY 环境变量提供私钥,则一切正常。我看到添加了身份。

我遇到的问题是,当我尝试使用 docker 镜像在 DC/OS 上运行服务时,ssh-agent 似乎不记得使用私有(private)添加的身份键。

我已从 DC/OS 检查了错误日志。没有错误。

有谁知道为什么在 DC/OS 上运行 docker 容器与在本地运行相比有何不同?

编辑:我添加了 DC/OS 服务描述的详细信息,以防万一:

{
"id": "/SOME-ID",
"instances": 1,
"cpus": 1,
"mem": 128,
"disk": 0,
"gpus": 0,
"constraints": [],
"fetch": [],
"storeUrls": [],
"backoffSeconds": 1,
"backoffFactor": 1.15,
"maxLaunchDelaySeconds": 3600,
"container": {
"type": "DOCKER",
"volumes": [],
"docker": {
"image": "IMAGE NAME FROM DOCKERHUB",
"network": "BRIDGE",
"portMappings": [{
"containerPort": SOME PORT NUMBER,
"hostPort": SOME PORT NUMBER,
"servicePort": SERVICE PORT NUMBER,
"protocol": "tcp",
"name": “default”
}],
"privileged": false,
"parameters": [],
"forcePullImage": true
}
},
"healthChecks": [],
"readinessChecks": [],
"dependencies": [],
"upgradeStrategy": {
"minimumHealthCapacity": 1,
"maximumOverCapacity": 1
},
"unreachableStrategy": {
"inactiveAfterSeconds": 300,
"expungeAfterSeconds": 600
},
"killSelection": "YOUNGEST_FIRST",
"requirePorts": true,
"env": {
"PRIVATE_KEY": "ID_RSA PRIVATE_KEY WITH \n LINE BREAKS",
}
}

最佳答案

Docker 版本

检查您的本地 Docker 版本是否与 DC/OS 代理上安装的版本相匹配。默认情况下,DC/OS 1.9.3 AWS CloudFormation 模板使用 CoreOS 1235.12.0 ,它附带 Docker 1.12.6 。从那时起,入口点的行为可能发生了变化。

Docker 命令

检查相关 Marathon 应用程序的 Mesos 任务日志,并查看执行了哪些 docker run 命令。在本地测试时,您可能会传递稍微不同的参数。

脚本错误

正如另一个答案中提到的,您提供的脚本有几个错误可能与故障有关,也可能无关。

  1. echo $PRIVATE_KEY 应该是 echo "$PRIVATE_KEY" 以保留换行符。否则 key 解密将失败,Bad passphrase, try again for/root/.ssh/id_rsa:
  2. expect -c "spawn ssh-add/root/.ssh/id_rsa; expect\"Enter passphrase for/root/.ssh/id_rsa:\"send\"\"; interact "应该是 expect -c "spawn ssh-add/root/.ssh/id_rsa; expect\"Enter passphrase for/root/.ssh/id_rsa:\"; send\"\n\"; interact "。它缺少分号和换行符。否则,expect 命令会失败而不执行。

基于文件的 secret

Enterprise DC/OS 1.10(1.10.0-rc1 现已推出)有一个名为 File Based Secrets 的新功能,允许注入(inject)文件(如 id_rsa 文件)而不将其内容包含在 Marathon 应用程序定义中,将它们安全地存储在 Vault使用 DC/OS Secrets

基于文件的 secret 不会为您执行 ssh-add,但它应该可以更轻松、更安全地将文件放入容器中。

Mesos 错误

Mesos 1.2.0 切换到使用 Docker --env_file 而不是 -e 来传递环境变量。这会触发不支持换行符的 Docker env_file bug。一个 workaround was put into Mesos and DC/OS ,但修复可能不在您使用的次要版本中。

手动解决方法是将 Marathon 定义的 rsa_id 转换为 base64 并返回到您的入口点脚本中。

关于docker - 在 DC/OS 的 docker 容器内运行时,ssh-agent 不记得身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com