在具有私有repo依赖关系的docker容器中使用bower

时间:2016-11-18 01:23:33

标签: git docker ssh bower

我正在尝试在docker容器中运行bower install,在docker-compose.yml

中作为命令传递

docker-compose.yml中的相关代码:

services:
  assets:
    build: ./src
    command: >
      sh -c '
      bower install --allow-root;
      '

bower.json具有以下依赖关系:

{
  "name": "projectname",
  "version": "version",
  "dependencies": {
    "remote-repo": "ssh://git@remoterepo.url/repo.git#branch"
  }
}

这个远程回购是私有的。主机具有正确的SSH凭据以从该远程启动。

我尝试将SSH凭据从我的主机传递到docker容器4或5种不同的方式,但每次尝试都会向我发出相同的错误消息:

docker_1   | bower repo#branch          ECMDERR Failed to execute "git 
ls-remote --tags --heads ssh://git@remoterepo.url/repo.git", exit code 
of #128 Host key verification failed. fatal: Could not read from 
remote repository.  Please make sure you have the correct access 
rights and the repository exists.

当我exec直接进入容器并尝试git克隆时,它会询问我是否确定要将远程数据库添加到known_hosts,然后它会询问我的密码短语是否为我的ssh密钥(正如第一次尝试连接遥控器时预期的那样。

我已按照此stackoverflow响应中的步骤尝试绕过提示:https://stackoverflow.com/a/23411161/4736263

甚至可以通过ssh扔掉所有内容,在RUN命令下将这些步骤添加到我的Dockerfile中:https://serverfault.com/questions/132970/can-i-automatically-add-a-new-host-to-known-hosts/316100#316100

现在,我的安装脚本(运行docker-compose up等)包括这一行:

cp $HOME/.ssh/id_rsa src/id_rsa

我已经确认id_rsa正在被正确复制到Dockerfile所在的目录中(具体来说,我应用程序中的src

我的Dockerfile包含:

# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Add remote's key
RUN ssh-keygen -R remoterepo.url
RUN ssh-keygen -R remoterepoIP
RUN ssh-keygen -R remoterepo.url,remoterepoIP
RUN ssh-keyscan -H remoterepo.url,remoterepoIP >> /root/.ssh/known_hosts
RUN ssh-keyscan -H remoterepoIP >> /root/.ssh/known_hosts
RUN ssh-keyscan -H remoterepo.url >> /root/.ssh/known_hosts

有没有办法让docker容器内的bower访问私人远程仓库?我觉得我已经尝试了所有的东西(我整个星期都尝试过不同的东西)。

1 个答案:

答案 0 :(得分:0)

此配置似乎有效的唯一方法是:

1)在私人仓库中为docker容器创建只读密钥 2)将只读信用卡和known_hosts放入具有Dockerfile
的目录中的repo中 3)调整id_rsa文件的权限

我尝试调整从主机复制的凭据的权限,但仍然提供权限被拒绝错误。解决这个问题的唯一方法是在我们的私人仓库中为这个容器创建一个特殊的只读密钥。

这并没有真正解决最初的问题,但它让我们成为了我们需要的地方。我们的实现是.gitignore凭证,并以另一种方式将它们传递给用户,这可以防止秘密存储在仓库中。

我从我们的安装脚本中取出了复制命令,因此Dockerfile中的最终结果在这里:

# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
COPY id_rsa /root/.ssh/id_rsa
COPY known_hosts /root/.ssh/known_hosts
RUN chmod 600 /root/.ssh/id_rsa

私钥与Dockerfile位于同一目录。

我怀疑问题仍然在于需要加密码 - 对2014年之前的StackOverflow文章发表了评论:can't use a passphrase protected one apparently

希望这有助于某人。