【发布时间】:2018-01-18 04:29:05
【问题描述】:
我正在尝试使用 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
我有一个私有存储库,我想在 docker 容器启动时克隆/拉取它。这就是我尝试将私钥添加到ssh-agent 的原因。
如果我将此映像作为本地 docker 容器运行并使用 PRIVATE_KEY 环境变量提供私钥,则一切正常。我看到添加了身份。
我遇到的问题是,当我尝试使用 docker 映像在 DC/OS 上运行服务时,ssh-agent 似乎不记得使用私钥添加的身份。
我已从 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 映像中包含密钥并将其推送到注册表,然后在 DC/OS 上使用它,或者您还需要使用 env var(它只会保留在正在运行的容器中,因为您不这样做'不使用任何卷等)
-
这意味着由于某种原因您没有设法将密钥添加到代理。深入调查哪些命令实际运行,哪些命令没有运行。
-
@Tobi,这就是我使用环境变量
$PRIVATE_KEY的原因。我们不想在 docker 镜像中存储任何密钥,因为我们公开存储我们的镜像。