2015-01-06 3 views
1

Это мой файл Dockerfile, который пытается настроить Nginx с помощью Phusion Passenger, а затем установить Ruby.Не удается запустить контейнер-докер

# Build command: docker build --force-rm --tag="rails" . 
# Run command: docker run -P -d rails 
FROM ubuntu:14.04 

ENV DEBIAN_FRONTEND noninteractive 

# Install nginx and passenger 
RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7 
RUN sudo sudo apt-get install -yf apt-transport-https ca-certificates 
RUN sudo echo 'deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main' > /etc/apt/sources.list.d/passenger.list 
RUN sudo chown root: /etc/apt/sources.list.d/passenger.list 
RUN sudo chmod 600 /etc/apt/sources.list.d/passenger.list 
RUN sudo apt-get update 
RUN sudo apt-get install -yf nginx-extras passenger 
RUN sudo service nginx restart 

# Install rbenv and ruby 
RUN sudo apt-get install -yf git autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev curl 
RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
RUN git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build 
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc 
RUN echo 'eval "$(rbenv init -)"' >> ~/.bashrc 
RUN /root/.rbenv/plugins/ruby-build/install.sh 
ENV PATH /root/.rbenv/bin:$PATH 
RUN rbenv install 2.1.5 
RUN rbenv global 2.1.5 

EXPOSE 80 

В принципе, я могу создать изображение просто отлично, но я не могу запустить контейнер с этого изображения.

Это мой первый опыт использования докеров, поэтому я подозреваю, что мне нужно использовать директиву CMD, но я не знаю, какая команда должна туда идти.

Я ценю любую помощь, чтобы указать, что не так с моим файлом Docker.

+1

Что делать * Я не могу запустить контейнер с этого изображения * означает? Вы получили сообщение об ошибке? Если да, то какой? Как вы пытаетесь запустить контейнер? ...? –

+0

Я не получаю сообщение об ошибке. Я запускаю контейнер с помощью docker run -P -d image_id. Состояние контейнера сразу после запуска было выведено (0) некоторое время назад. – Khanetor

+1

Да, вы не получите сообщение об ошибке, потому что все сработало :) Я добавил ответ. –

ответ

5

Контейнер работает успешно, его сразу же отключает, так как вы не указываете какой-либо процесс запуска. Контейнер будет работать только до его основного процесса. Когда вы запустили его в фоновом режиме (флаг -d), он не предоставит никакого вывода, что немного запутывает.

Например:

$ docker run ubuntu echo "Hello World" 
Hello World 

Контейнер выполняет команду и вышла, как и ожидалось.

$ docker run -d ubuntu echo "Hello World" 
efd8f9980c1c9489f72a576575cf57ec3c2961e312b981ad13a2118914732036 

То же самое, как это случилось, но, как мы столкнулись с -d, мы получили идентификатор контейнера обратно, а не выход. Мы можем получить результат с помощью команды logs:

$ docker logs efd8f9980c1c9489f72a576575cf57ec3c2961e312b981ad13a2118914732036 
Hello World 

Что вам нужно сделать, это начать рельсы приложение, или любой другой процесс, который вы хотите, чтобы контейнер для запуска при запуске контейнера. Вы можете либо сделать это из команды docker run, либо с помощью инструкции CMD в файле Docker. Обратите внимание, что основной процесс должен оставаться на переднем плане - если он вилки на заднем плане, контейнер выйдет.

Если вы хотите, чтобы получить оболочку в контейнере, запустите его с -it например:

$ docker run -it ubuntu /bin/bash 

Честно говоря, я думаю, вы бы лучше обслуживаться с помощью официального изображения, например, https://registry.hub.docker.com/_/rails/.

+0

Я думаю, что я получаю кое-что благодаря вашему ответ. Действительно, мне нужно запустить что-то в противном случае, процесс докера завершится. Я обнаружил, что команда 'nginx' может запускать nginx, как показано в официальном файле докинджеров Nginx. Однако, даже если я запустил эту команду, контейнер немедленно выйдет. Как я могу запустить nginx? – Khanetor

+0

Я также пробовал доклер для пассажиров до этого, но у них нет последнего Ruby. Я могу начать с их изображения и обновить Ruby, но я также хочу узнать, как создать собственное изображение с нуля. – Khanetor

+0

Вам нужно запустить nginx на переднем плане. Глядя на файл nginx dockerfile, вам нужно 'nginx -g daemon off' –

0

Посмотрите, что говорит журналы, выпуская

docker logs rails

или, как

docker ps -an 1

должен показать последний идентификатор, с помощью команды

docker logs this_id

+0

Выход для журналов пуст. – Khanetor

2

Чтобы начать то, что вам нужно, вы должны использовать ENTRYPOINT, проверьте official documentation.

+0

Хм, я думаю, что изображение Ubuntu запускается/bin/bash по умолчанию. –

+0

Я не думаю, что при использовании Dockerfile вы просто строите изображение. Но вы можете ssh к нему. – bachr

+0

Я говорю, что этот файл Dockerfile наследуется от образа Ubuntu, который имеет запуск CMD/bin/bash. Это будет запущено при запуске контейнера, если вы его не отмените. –

 Смежные вопросы

  • Нет связанных вопросов^_^