【问题标题】:Bundler can't see gems in a dockerized environmentBundler 在 dockerized 环境中看不到 gem
【发布时间】:2019-12-10 08:58:38
【问题描述】:

我一直在尝试 dockerize 用于 azure web 容器的 rails 应用程序。在创建过程中一切似乎都很顺利,bundler 运行并且显然安装了 gem。但是,当我 ssh 进入它并进入应用程序目录以运行 rails 控制台时,我收到未安装 rails 的错误消息。我已经尝试使用 bundle exec 和不使用 bundle exec 运行它,我什至尝试手动运行已编译的控制台,但这只会引发未安装 rake 的错误。这几天我一直在绞尽脑汁,我已经尝试了无数的 Dockerfile 配置,但似乎没有任何效果。这是我当前的 Dockerfile 供参考。

FROM ruby:2.6.3

ENV SSH_PASSWD "root:Docker!"

# Update and install packages
RUN apt-get update \
       && apt-get install -y build-essential libpq-dev nodejs \
       && apt-get install -y --no-install-recommends openssh-server \
       && echo "$SSH_PASSWD" | chpasswd  \
       && curl -sL https://deb.nodesource.com/setup_11.x | bash - \
       && apt-get install -y nodejs \
       && npm install -g yarn

# Bundler config
ENV GEM_HOME=/bundle
ENV BUNDLE_PATH $GEM_HOME
ENV BUNDLE_APP_CONFIG=$BUNDLE_PATH \
BUNDLE_BIN=$BUNDLE_PATH/bin
ENV PATH /app/bin:$BUNDLE_BIN:$PATH

# Upgrade rubygems
RUN gem update --system

# Set working directory
RUN mkdir /app
WORKDIR /app

# Copy Files
COPY Gemfile* package.json yarn.lock ./
COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/

# Set permissions for init script
RUN chmod u+x /usr/local/bin/init.sh

# Install bundler and gems
RUN bundle install
RUN yarn install --check-files

#Copy Code
COPY . ./
EXPOSE 3000 2222

ENTRYPOINT [ "init.sh" ]

【问题讨论】:

  • 您是否在 Azure 上安装了 Postgres?我不熟悉 Azure,但在 Heroku 上有用于访问控制台之类的自定义命令。例如'heroku run rails c'。它应该只是 Azure 上的 rails c 我假设您将它作为虚拟机运行吗?您是否尝试过运行命令 `rails -v?
  • 不,但据我所知,bundler 在任何时候都不会与数据库交互。在我看来,这似乎是捆绑程序本身或其配置的问题。我在一个容器中运行 rails,我直接 ssh 进入它,所以命令应该与任何正常系统上的相同,因为我不是通过 azure 执行它们。 Rails -v 只是说即使我在 Dockerfile 中运行 bundle install 也没有安装 rails。
  • 对,但你说“...进入应用目录运行 rails 控制台”
  • 我的意思是与您在本地计算机上的方式相同。我 ssh 进入容器,cd 进入 app 目录并尝试运行控制台或任何 rake 任务,并且捆绑程序开始说未安装 gem。
  • 如果你运行rails -v?

标签: ruby-on-rails docker rubygems bundler


【解决方案1】:

为此,请尝试运行“bundle config”,因为您的环境可能已经配置为让 bundler 使用默认文件。一旦 bundler 在您的环境中设置了配置,所有后续的 bundle 运行都将使用该配置。这是作为入口点/命令运行的 app.sh 的一部分示例。如果它是在运行 puma 服务器之前的开发版本,则此脚本会删除“生产”标志并安装开发依赖项。

#!/usr/bin/env bash if [[ "$RAILS_ENV" == "development" ]] || [[ "$RAILS_ENV" == "test" ]]; then echo "--> Installing development and test bundles" bundle config --delete without bundle install --with development,test else echo "--> Installing production bundles" bundle install fi

在我们的例子中,我们需要删除 without 子句,因为这会阻止已安装的 gem 在捆绑安装期间运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多