Я создал Dockerfile на основе описания для создания приложения rails в Linux. В настоящее время у меня есть две проблемы с текущей настройкой:
Во-первых, я получаю сообщение об ошибке или предупреждение после каждой команды RUN, начинающейся с переменной среды $ shell. Ошибка выглядит следующим образом:
mesg: ttyname failed: Inappropriate ioctl for device
Во-вторых, мой контейнер останавливается сразу после запуска с
docker run -d --name rails rails:test
Мой текущий файл docker выглядит следующим образом:
FROM ubuntu:18.04
RUN mkdir /usr/src/rails
WORKDIR /usr/src/rails
RUN apt-get update && apt-get install -y curl gnupg
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt install -y yarn
RUN curl -sSL https://get.rvm.io | bash
RUN useradd -G rvm rails
ENV shell /bin/bash -l -c
#RUN . /usr/local/rvm/scripts/rvm
RUN echo ". /etc/profile.d/rvm.sh" >> ~/.bashrc
RUN $shell "rvm requirements"
RUN $shell "rvm install ruby"
RUN echo "gem: --no-rdoc --no-ri" >> ~/.gemrc
RUN $shell "gem install rails"
RUN $shell "ruby -v" && $shell "rails -v"
USER rails
EXPOSE 3000
#CMD ["rails", "server", "-b", "0.0.0.0"]
CMD ["/bin/bash"]
Решение с переменной $shell
, которое я нашел на другом сайте. Без команды /bin/bash -l -c
процесс сборки не удастся. Команда rvm
или gem
будет неизвестна. Упомянутая команда будет использоваться в качестве оболочки для реальной команды внутри кавычек. Я не очень понимаю, зачем это нужно. Если я создаю контейнер docker и выполняю команды, как они есть в Dockerfile, то все работает нормально. Почему это не работает, когда я выполняю команду внутри сценария Dockerfile?
Поскольку я использую команду оболочки, все работает хорошо, но я получаю это сообщение об ошибке или предупреждение, упомянутое выше. Изображение будет сделано, так что это скорее мелкая проблема. Основная проблема в том, что мой контейнер не запускается. Если я наберу команду docker run -d rails:test
, контейнер будет сразу же завершен. Я не очень понимаю, почему. У кого-нибудь есть объяснения?