2015-04-10 4 views
0

Я новичок, использующий Docker и Python, и мне нужна помощь. Я пытаюсь запустить программу Python внутри контейнера Docker. Эта программа должна запускаться периодически, поэтому мой подход был после клонирования и установки моей программы, чтобы запустить ее как задание cron. Я создал Dockerfile со всеми шагами, но он не работает. Я попытался войти в контейнер, чтобы запустить приложение, но он показывает мне эту ошибку:Запуск программы python на докере

[email protected]:/bsnap/bsnap# bsnap 
Traceback (most recent call last): 
    File "/usr/local/bin/bsnap", line 9, in <module> 
    load_entry_point('bsnap==1.1', 'console_scripts', 'bsnap')() 
    File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 522, in load_entry_point 
    return get_distribution(dist).load_entry_point(group, name) 
    File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2647, in load_entry_point 
    return ep.load() 
    File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2320, in load 
    return self.resolve() 
    File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2326, in resolve 
    module = __import__(self.module_name, fromlist=['__name__'], level=0) 
    File "build/bdist.linux-x86_64/egg/bsnap/app.py", line 27, in <module> 
    File "build/bdist.linux-x86_64/egg/bsnap/log.py", line 33, in <module> 
    File "/usr/local/lib/python2.7/logging/handlers.py", line 760, in __init__ 
    self._connect_unixsocket(address) 
    File "/usr/local/lib/python2.7/logging/handlers.py", line 788, in _connect_unixsocket 
    self.socket.connect(address) 
    File "/usr/local/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
socket.error: [Errno 2] No such file or directory 

Это мой Dockerfile:

FROM ubuntu:14.04 

MAINTAINER Dave J. Franco 

RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sources.list 

RUN apt-get update && apt-get upgrade -y 

#Install container essentials 
RUN apt-get install -y tar \ 
        git \ 
        curl \ 
        nano \ 
        wget \ 
        dialog \ 
        net-tools \ 
        build-essential 
# Install pip's dependency: setuptools: 
RUN apt-get install -y python python-dev python-distribute python-pip 

#git clone project 
RUN git clone https://github.com/davejfranco/bsnap.git 

#ADD the bsnap configuration file 
ADD bsnap.conf /bsnap/bsnap/bsnap.conf 

WORKDIR /bsnap 

#Install bsnap 
RUN python setup.py install 

#Add an entry on crontab to execute the script every week 
RUN echo "30 16 09 04 * root /usr/local/bin/bsnap" >> /etc/crontab 
+0

Может ли это быть связано с каким-либо адресом в bsnap.conf? Также cron не будет работать в этом контейнере (и он не должен использоваться в докере в большинстве случаев). – ISanych

ответ

1

"I created the Docker file with all the steps but it's not working"

Нет, ваш Dockerfile не хватает CMD (или ENTRYPOINT) поэтому Docker не знает, что нужно запускать при запуске контейнера.

Вы можете выполнить команду, которая ничего не делает, а затем ждать, пока cron выполнит свою работу. Или вы могли бы написать хроны сценарию себя:

#!/bin/bash 
mins=0 
while true; do 
if [ $mins -lt 10080 ]; then 
    sleep 60 
    mins=$[mins+1] 
else 
    /bsnap/bsnap/bsnap 
    mins=0 
fi 
done 

Или вы могли бы сделать свой Dockerfile сказать CMD /bsnap/bsnap/bsnap, а затем использовать хроны в вашей хоста машины, чтобы запустить контейнер каждую неделю. Вот как я это сделаю, и я считаю, что это самый путь Докер-Иш.

"this is my Dockerfile"

Вы должны рассмотреть возможность использования the official Python container, а не начинать с нуля. Это дает понять, что вы используете Python 2.7, и он работает быстрее (потому что он загружает, а не создает больше вещей).

"I tried entering in the instance to run the application but it shows me this"

Здесь исходит ошибка (GitHib link). Bsnap ожидает, что /dev/log существует, но он не находится в контейнере Docker. Если он существует на вашем хосте, и вы хотите его использовать, вы можете передать -v /dev/log:/dev/log, чтобы открыть его внутри контейнера. В противном случае вам может потребоваться отредактировать код bsnap, чтобы удалить попытку записи таким образом.

+0

большое спасибо за все ваши рекомендации. –

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