私人 gem 没有安装在 docker 中

Posted

技术标签:

【中文标题】私人 gem 没有安装在 docker 中【英文标题】:Private gems are not getting installed in docker 【发布时间】:2016-08-21 11:38:39 【问题描述】:

我正在尝试使用 docker 运行 rails 应用程序。通过 github 的 ssh url 安装的 gem 很少,如下所示:

宝石文件

gem 'swagger-docs', :git => 'git@github.com:xyz/swagger-docs.git', :branch => 'my_branch'

我在 docker 中添加了keys,它能够克隆所需的 repo 并从 git 安装 gem。

Dockerfile

RUN mkdir -p /root/.ssh
COPY ./id_rsa /root/.ssh/id_rsa

RUN chmod 700 /root/.ssh/id_rsa

RUN ssh-keygen -f /root/.ssh/id_rsa -y > /root/.ssh/id_rsa.pub

RUN ssh-keyscan github.com >> /root/.ssh/known_hosts

当我构建它(包括bundle install)时,一切顺利,镜像构建成功。但是当我运行docker-compose up 时,会出现以下错误

/usr/local/bundle/gems/bundler-1.9.2/lib/bundler/source/git/git_proxy.rb:155:in `allowed_in_path': The git source git@github.com:xyz/swagger-docs.git is not yet checked out. Please run `bundle install` before trying to start your application (Bundler::GitError)

【问题讨论】:

复制密钥后,您的 Dockerfile 是否包含 RUN bundle install @NabeelAmjad 是的,当然。 本例中 id_rsa 的位置? 【参考方案1】:

我会调试这个的一种方法是做一个Dockerfile

RUN mkdir -p /root/.ssh
COPY ./id_rsa /root/.ssh/id_rsa

RUN chmod 700 /root/.ssh/id_rsa

RUN ssh-keygen -f /root/.ssh/id_rsa -y > /root/.ssh/id_rsa.pub

RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
COPY #copy yout Gemfile and Gemfile.lock
CMD /bin/bash

然后构建它并执行一个简单的 docker run

docker build . -t test
docker run --rm -it test

现在,您可以从内部运行 bundle install 并慢慢查看输出...我什至会推荐一个极简的 Gemfile

【讨论】:

本例中 id_rsa 的位置?【参考方案2】:

您是否尝试过使用 docker 实验功能?他们为using ssh to access private data in builds 提供了一些东西,这使我可以在我的 docker 构建中使用托管在 Github 上的私人 gem。要启用它,您需要做以下 4 件事:

1. 使用 git 标签将私有 gem 添加到您的 Gemfile:
gem 'rack', git: 'https://github.com/rack/rack'
2. 将 DOCKER_BUILDKIT 环境变量设置为 1 并在调用构建命令时启用默认 ssh 标志:
$ DOCKER_BUILDKIT=1 docker build --ssh default .
3. 将 docker 文件的第一行设置为以下注释:
# syntax=docker/dockerfile:experimental
4. 使用 --mount=type=ssh 标志在 Docker 文件中执行 ssh 设置以添加 ssh 密钥并在安装 gem 时使用 ssh 密钥:
# Make ssh dir and download public key for github.com to add it to known_hosts
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Add your ssh key, update bundler, and use bundler to install all your gems
RUN --mount=type=ssh ssh-add -L && gem install bundler && bundle install

将 --mount=type=ssh 与 docker 实验功能一起使用,让 docker 负责保护您的 ssh-key-information 机密。这在过去一直是针对 docker 的投诉,而且似乎使用实验性功能是目前我遇到的将您的 ssh 私钥传递给您的构建的最安全和最简单的方法。

你的 Dockerfile 应该是这样的:(个人示例)

# syntax=docker/dockerfile:experimental
FROM ruby:3.0.0
    
WORKDIR /usr/src/app
    
COPY Gemfile Gemfile.lock /usr/src/app/
    
# Make ssh dir and download public key for github.com to add it to known_hosts
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Add your ssh key, update bundler, and use bundler to install all your gems
RUN --mount=type=ssh ssh-add -L && gem install bundler && bundle install
    
COPY . .
    
EXPOSE 8080
    
CMD ["bundle", "exec", "rackup", "-o", "0.0.0.0", "-p", "8080"]

【讨论】:

【参考方案3】:

尝试在 Gemfile 中用 https 替换 git,即

  gem 'swagger-docs', git: 'https://github.com:xyz/swagger-docs.git', branch: 'my_branch'

...或者在运行 bundle install 之前将其添加到您的 Dockerfile:

  RUN git config --global url."https://".insteadOf git://

如果没有任何效果,则只需运行两次bundle install,即

  ...
  RUN gem install bundler && bundle install

  CMD bundle install && rails s -p 3000 -b 0.0.0.0

【讨论】:

我遇到了同样的错误,使用https:// 而不是git:// 没有帮助:(

以上是关于私人 gem 没有安装在 docker 中的主要内容,如果未能解决你的问题,请参考以下文章

在 GitLab CI 包构建中缓存 gem

创建docker私人仓库

项目经验Docker安装

云原生之Docker实战使用docker部署Wiznote私人笔记系统

配置gem5-gpu docker版

gitlab私人代码仓库搭建(docker)