【问题标题】:Docker/Ruby - creating Docker service results in "rails new APP_PATH [options]" and services exiting with code 0Docker/Ruby - 创建 Docker 服务导致 \"rails new APP_PATH [options]\" 和服务以代码 0 退出
【发布时间】:2023-02-25 06:14:00
【问题描述】:

我是 Ruby 的新手,也是 Docker 的新手。我事先在这里寻找答案,但没有看到我的问题。

这是我的 Dockerfile

FROM ruby:3.2.1-alpine 
# Create app directory
WORKDIR /rails
RUN apk update && \
  apk add --no-cache build-base nodejs postgresql-client yarn
# Install Gems
COPY Gemfile Gemfile.lock /rails/
RUN bundle install --jobs=3 --retry=3
# Install npm packages
COPY package.json yarn.lock /app/
# Create Rails application
RUN rails new app -j esbuild --force --database=postgresql --css=bootstrap --skip-git

COPY . .

# Configure the main process to run when running the image
CMD ["rails", "s", "-b", "0.0.0.0"]

还有我的 docker-compose.yml

services:
  app:
    build: .
    volumes:
        - .:/rails
    ports:
        - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres
    restart: always
    volumes:
    - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password

我正在尝试使用 Docker 创建一个容器化的 Ruby 应用程序。在我的终端中,当我键入 docker compose up --build 时,我在控制台中收到以下消息

Attaching to ruby-on-rails-boilerplate-app-1, ruby-on-rails-boilerplate-db-1
ruby-on-rails-boilerplate-app-1  | Usage:
ruby-on-rails-boilerplate-app-1  |   rails new APP_PATH [options]
ruby-on-rails-boilerplate-app-1  |
ruby-on-rails-boilerplate-app-1  | Options:

等等。看起来我不在正确的目录中,但我找不到验证的方法。我的问题是什么?我错过了什么?如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: ruby-on-rails ruby docker


    【解决方案1】:

    在您的 Docker 映像中,您是:

    1. 创建目录/rails
    2. 正在将您的Gemfile和Gemfile.lock复制到/rails
    3. 从/rails运行bundle install
    4. 正在从目录/rails 运行rails new app,从而尝试创建一个新的名为/rails/app 的目录并试图放置一个新的该目录中的 Rails 应用程序
    5. 将.(及其所有文件和文件夹)复制到/rails

      最好的情况是,最终您将拥有:

      • /rails/<your actual Rails app>
      • /rails/app/<a new Rails app>

      这很可能不是您打算做的。我很难想象为什么你会想要从头开始创建一个新的 Rails 应用程序作为创建 Docker 映像的一部分,这就是为什么我认为这不是故意的。

      您很可能打算将本地磁盘上已有的 Rails 应用程序复制到 Docker 映像中,并启动 Docker 容器那轨道应用程序。如果是这种情况,那么您应该删除以下行,这样您就不会尝试在/rails/app 中创建新的应用程序:

      # Create Rails application
      RUN rails new app -j esbuild --force --database=postgresql --css=bootstrap --skip-git
      

      此外,您应该仔细查看此行:

      COPY package.json yarn.lock /app/
      

      您正在将这些文件复制到/rails 之外的/app。我假设您的本地目录结构有 Gemfile 和 Gemfile.lock 以及 package.json 和 yarn.lock 都在同一目录中,并且您打算将它们放在 Docker 映像中的同一目录中。如果是这种情况,那么您需要将 /app/ 更改为 ./,以便将它们复制到 /rails。

      最后,这一行:

      COPY Gemfile Gemfile.lock /rails/
      

      可以简化为:

      COPY Gemfile* ./
      

      因为 ./ 将引用相对于 WORKDIR 的路径,在你的例子中是 /rails,所以指定 /rails/ 是不必要的冗余。

      我建议您在 Docker Compose 之外测试构建 Docker 镜像。你可以这样做:

      docker build . -t rails
      

      观察输出以确认图像构建成功。构建完成后,您可以使用以下命令从图像运行一个临时容器:

      docker run -it --rm rails sh
      

      这会将您放入容器中的 shell,并允许您使用,例如 ls 检查目录结构,并确保图像看起来像您期望的样子。一旦您确定它已正确构建并使用 Docker Compose 运行它,您就可以exit。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-10-17
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多