我一直在尝试为 azure web 容器 dockerize 一个 rails 应用程序。在创建过程中一切似乎都很顺利,捆绑器运行并显然安装了宝石。但是,当我通过 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" ]
对于这个,请尝试运行"捆绑配置",因为您的环境可能已经配置为让捆绑器使用默认文件。 一旦捆绑程序在您的环境中设置了配置,所有后续捆绑软件运行都将使用该配置。 下面是作为入口点/命令运行的部分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 在捆绑安装期间运行。