在Docker容器中使用Bower与私有存储库依赖项

7

我正在尝试在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凭证,可以从远程拉取代码。

我尝试了4到5种不同的方式,将主机的SSH凭证传递给Docker容器,但每次尝试都会出现相同的错误信息:

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://dev59.com/D2Ag5IYBdhLWcg3wm8D7#23411161 甚至通过ssh添加了我可以添加的所有步骤,将这些步骤添加到我的Dockerfile下的RUN命令中: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

这个配置似乎只有一种方法可以工作:

1)为私有仓库中的docker容器创建只读密钥
2)将只读凭据和known_hosts放入包含Dockerfile的目录中的仓库中
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

希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接