Как установить новые драгоценные камни в образ rails docker, не перестраивая его - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать свое приложение rails в среде docker. Я использовал тома для монтирования исходных каталогов с хоста по заданному пути внутри контейнера. Приложение находится в стадии разработки, и мне нужно постоянно добавлять в него новые жемчужины. Я устанавливаю гем из bash моего работающего контейнера, он устанавливает гем и необходимые зависимости. Но когда я удалил запущенные контейнеры (docker -compose down), а затем снова создал их (docker -compose up), мое веб-изображение rails показало ошибки отсутствия драгоценных камней. Я знаю, что повторное построение изображения добавит драгоценные камни, но ЕСТЬ ЛЮБОЙ СПОСОБ ДОБАВИТЬ КАМНИ БЕЗ ВОССТАНОВЛЕНИЯ ОБРАЗА? проект

ДОКЕРФАЙЛ

FROM ruby:2.7.1-slim-buster
LABEL MAINTAINER "Prayas Arora" "<prayasa@mindfiresolutions.com>"

# Install apt based dependencies required to run Rails as
# well as RubyGems. As the Ruby image itself is based on a
# Debian image, we use apt-get to install those.
RUN apt-get update \
    && apt-get install -qq -y --no-install-recommends \
       build-essential \
       libpq-dev \
       netcat \
       postgresql-client \
       nodejs \
    && rm -rf /var/lib/apt/lists/*


ENV APP_HOME /var/www/repository/repository_api

# Configure the main working directory. This is the base
# directory used in any further RUN, COPY, and ENTRYPOINT
# commands.
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

# Copy the Gemfile as well as the Gemfile.lock and install
# the RubyGems. This is a separate step so the dependencies
# will be cached unless changes to one of those two files
# are made.
COPY ./repository_api/Gemfile $APP_HOME/Gemfile
COPY ./repository_api/Gemfile.lock $APP_HOME/Gemfile.lock
RUN bundle install

# Copy the main application.
COPY ./repository_api $APP_HOME 

# Add a script to be executed every time the container starts.
COPY ./repository_docker/development/repository_api/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

# Expose port 3000 to the Docker host, so we can access it
# from the outside.
EXPOSE 3000

# The main command to run when the container starts. Also
# tell the Rails dev server to bind to all interfaces by
# default.
CMD ["rails","server","-b","0.0.0.0"]

docker -compose.yml

    container_name: repository_api
    build:
      context: ../..
      dockerfile: repository_docker/development/repository_api/Dockerfile
    user: $UID
    env_file: .env
    stdin_open: true
    environment:
      DB_NAME: ${POSTGRES_DB}
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      DB_USER: ${POSTGRES_USER}
      DB_HOST: ${POSTGRES_DB}
    volumes:
      - ../../repository_api:/var/www/repository/repository_api
    networks:
      - proxy
      - internal
    depends_on:
      - repository_db

Ответы [ 2 ]

0 голосов
/ 27 июня 2020

Простое решение - поместить драгоценные камни в объем docker. Вы можете создать том в docker и прикрепить его к пути для объединения драгоценных камней. Это сохранит общее состояние, и вам не потребуется устанавливать драгоценные камни в каждый созданный вами контейнер.

  container_name: repository_api
  build:
    context: ../..
    dockerfile: repository_docker/development/repository_api/Dockerfile
  user: $UID
  env_file: .env
  stdin_open: true
  environment:
    DB_NAME: ${POSTGRES_DB}
    DB_PASSWORD: ${POSTGRES_PASSWORD}
    DB_USER: ${POSTGRES_USER}
    DB_HOST: ${POSTGRES_DB}
  volumes:
    - ../../repository_api:/var/www/repository/repository_api
    - bundle_cache:/usr/local/bundle
  networks:
    - proxy
    - internal
    .
    .
volumes: 
  bundle_cache:

Кроме того, от / c до bundler.io , официального Docker изображения для Ruby предполагают, что вы будете использовать только одно приложение с одним Gemfile, и никакие другие драгоценные камни или Ruby приложения не будут установлены или запущены в вашем контейнере. Итак, как только вы добавили все драгоценные камни, необходимые для разработки вашего приложения, вы можете удалить этот том bundle_cache и перестроить свой образ с последним Gemfile.

0 голосов
/ 28 мая 2020

Вы можете использовать docker commit <container_id> <image_name>, чтобы сохранить изменения этого изображения или нового изображения.

...