Создание файлов в Docker и Docker Compose

Я изучаю Docker и немного запутался, и я был бы очень признателен за совет.

При создании нового приложения rails. Следуя рекомендациям руководства Docker Быстрый старт: Compose и Rails. Они шаги следующие.

  1. Создать Dockerfile и точку входа
  2. Создайте Gemfile с исходным кодом и драгоценным камнем rails.
  3. Создайте пустой Gemfile.lock
  4. Создайте файл docker-compose.yml и службы имен.
  5. Создайте новое приложение rails, используя docker-compose run.

Новая команда рельсов.

docker-compose run --no-deps web rails new . --force -d mysql

Это мой простой Dockerfile:

FROM ruby:3.1.1-alpine3.15

RUN apk update -q
RUN apk add bash yarn git build-base nodejs mariadb-dev tzdata

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

COPY package.json /app/package.json
COPY yarn.lock /app/yarn.lock

RUN gem install bundler
RUN gem update bundler
RUN bundle install

COPY entrypoint.sh /usr/bin
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3000

Это мой docker-compose.yml:

version: "3.9"
services:
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - "3000:3000"

Как видите, в моем файле docker-compose.yml указан только один сервис, потому что мне не нужны никакие другие сервисы или контейнеры.

Все работает нормально, когда я использую команду docker-compose run rails new... она создает новое приложение rails и сохраняет файлы в моей локальной исходной папке. Так что я могу открывать и редактировать файлы для разработки приложения. Идеальный.

Но когда я пытаюсь создать новое приложение Rails без использования docker-compose.yml и только с файлом Dockerfile. Сгенерированные файлы не сохраняются в моей локальной исходной папке, а только в контейнере. Я могу только предположить, потому что я вынужден создавать образ перед запуском его в контейнере для создания нового приложения rails.

При использовании без docker-compose.yml. Сначала я должен создать образ.

docker build -t image_name .

Затем я могу запустить контейнер и сгенерировать приложение rails.

docker run image_name rails new . --force -d mysql

Очевидно, что это не сохраняет новые файлы в моей локальной исходной папке.

Как я могу сгенерировать новое приложение Rails только с моим Dockerfile без docker compose и при этом сохранить вновь созданные файлы в моей локальной исходной папке?

Должно быть, я что-то упускаю, но я провел много исследований и не могу найти ответ.

🤔 А знаете ли вы, что...
Ruby on Rails предоставляет множество готовых решений для обработки типичных задач, таких как маршрутизация и работа с базой данных.


34
1

Ответ:

Решено

В docker-compose.yml у вас есть ключ «volumes», как показано ниже.

volumes:
  - .:/app

Но при использовании его в CLI вы пропускаете передачу этих томов.

Вы можете передать эти тома, как в коде ниже.

docker run -d --name=rails --volume /your/workdir:/app image_name

Если вы хотите узнать больше о томах, вы можете узнать здесь.