Допустим, у меня есть Dockerfile
, который будет запускать приложение Ruby on Rails:
FROM ruby:2.5.1
# - apt-get update, install nodejs, yarn, bundler, etc...
# - run yarn install, bundle install, etc...
# - create working directory and copy files
# ....
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
Насколько я понимаю, контейнер является неизменяемым запущенным экземпляром изображения и набором параметров времени выполнения (например,сопоставления портов, сопоставления томов, сети и т. д.).
Так что, если я соберу и запущу контейнер из вышеуказанного файла, я получу что-то, что выполняет значение по умолчанию CMD
выше (rails server
)
docker build -t myapp_web:latest
docker create --name myapp_web -p 3000:3000 -v $PWD:/app -e RAILS_ENV='production' myapp_web:latest
docker start myapp_web
Отлично, так что теперьон запускает rails server
в контейнере с CONTAINER_ID
.
Но, скажем, завтра я хочу запустить rake db:migrate
, потому что я что-то обновил.Как мне это сделать?
Я не могу использовать docker exec
, чтобы запустить его в этом контейнере, потому что db:migrate
завершится ошибкой, пока rails server
работает
Если я остановлю rails server
(и, следовательно, контейнер), мне нужно будет создать новый контейнер с теми же параметрами времени выполнения, но другой командой (rake db:migrate
), которая создаст новый CONTAINER_ID
.А затем, после запуска, я должен перезапустить свой оригинальный контейнер, который запускает rails server
.
Неужели # 2 - это то, с чем мы должны жить?Каждое новое рейк-задание, которое я запускаю и требует закрытия rails server
, должно будет создавать новый КОНТЕЙНЕР, который со временем накапливается.Есть ли более "правильный" способ запустить это?
Спасибо!
РЕДАКТИРОВАТЬ : Если путь №2 - это путь, есть ли простой способ создать новый контейнер из существующего контейнера, чтобы я мог скопироватьвсе конфиги времени выполнения и просто поменять команду?