我正在尝试使用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)
答案 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