Docker, как скопировать специфичные для докера версии файлов в WORKDIR - PullRequest
0 голосов
/ 27 февраля 2019

Можно ли использовать Docker's COPY или RUN cp в Dockerfile для перезаписи файла конфигурации по умолчанию версией файла, специфичной для Docker?

В проекте Rails наша папка конфигурации имеет несколько версийфайла database.yml для разных сред:

# projectname/config/
database.yml # an unused default placeholder
database_for_docker_2.yml
database_for_vagrant.yml

Для разных сред разработки (vagrant + virtualbox vs docker) во время инициализации машины / контейнера мы копируем соответствующую версию .yml в database.yml

В файле Docker после этого раздела:

WORKDIR /my_app
RUN bundle install 
COPY . /my_app

мы пытались:

RUN cp ./config/database_docker_2.yml /my_app/config/database.yml

, но файл, похоже, не копируется, когда мы раскручиваем контейнер, используется версия по умолчанию для database.yml.

Затем мы попробовали:

COPY ./config/database_docker_2.yml /my_app/config/database.yml

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

Что работает, так это добавление еще одной записи в раздел тома docker-compose.yml специально для этого одного файла:

    volumes:
      - .:/my_app
      - ./config/database_docker_2.yml:/my_app/config/database.yml

, но мы предпочитаем управлять размещением специфичных для env версий файлов в Dockerfile (в отличие от засорения docker-compose.yml такими файлами, специфичными для env)

1 Ответ

0 голосов
/ 27 февраля 2019

Команда COPY ./config/database_docker_2.yml /my_app/config/database.yml, вероятно, работает, нет причин, по которым она не должна предполагать, что источник существует.

Что я подозреваю, так это то, что когда вы тестируете его, у вас уже есть том с .:/my_app, которая затем показывает вам локальную папку, а не папку в контейнере.

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

С другой стороны:

Если вы еще не заблокированы в способе обработки этой конфигурации с несколькими базами данных, я бы рассмотрел вопрос о переоценке вашей ситуации, ипытаясь найти решение, которое не требует изменения database.yml для каждой среды.Одним из способов будет database.yml использовать переменную среды (обычно DATABASE_URL), и тогда у вас будет один docker-compose для всех и один database.yml для всех, и вы будете конфигурировать среду только с переменными среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...