私人 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 中的主要内容,如果未能解决你的问题,请参考以下文章