私有宝石没有安装在docker中

时间:2016-04-27 09:12:07

标签: ruby-on-rails ruby git docker docker-compose

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

  

的Gemfile

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)

3 个答案:

答案 0 :(得分:0)

尝试在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

答案 1 :(得分:0)

您是否尝试过使用 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 密钥信息。这在过去一直是对 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"]

答案 2 :(得分:0)

我调试的一种方法是执行 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