база данных sqlite в томе докера не открывается - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создать базу данных sqlite на томе в контейнере докера.Когда выполнение достигает c = conn.cursor() a, появляется следующая ошибка:

sqlite3.ProgrammingError: Cannot operate on a closed database.

Я хотел повторно использовать процесс подключения, поэтому построил следующие функции, которые, я думаю, могут быть там, где проблема:

def create_sqlite_conn(db):
    try:
        conn = sqlite3.connect(db, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
        return conn
    except sqlite3.Error as e:
        logging.warning("WARNING: Error accessing DB: {}".format(db), e)
    finally:
        conn.close()

def create_db(db):
    conn = create_sqlite_conn(db)
    c = conn.cursor()
    c.execute('''CREATE TABLE table1(id INTEGER PRIMARY KEY AUTOINCREMENT, ip_ver TEXT, date_time DATETIME)''')
    conn.commit()

Это вызывается с помощью:

create_db('/home/web/data/new_db.sql')

Этот код выполняется за пределами контейнера докера, поэтому мне интересно, связано ли это с альпийским или докерским интерфейсом.Мой файл Docker выглядит так:

FROM alpine:3.7

RUN apk --no-cache add python3 build-base linux-headers python3-dev \
        && pip3 install virtualenv \
        && addgroup -g 500 web \
        && adduser -D -u 1000 -G web web

WORKDIR /home/web

ENV PYTHONPATH /home/web/myapp

USER web

RUN mkdir -p /home/web/env /home/web/myapp /home/web/data/

COPY myapp/__init__.py /home/web/myapp/
COPY myapp/myapp.py /home/web/myapp/
COPY setup.py /home/web/myapp/
COPY requirements.txt /home/web/myapp/
COPY README.txt /home/web/myapp/

RUN /usr/bin/virtualenv -p python3 /home/web/env \
        && source /home/web/env/bin/activate \
        && python -m pip install ./myapp/ \
        && python -m pip install -r ./myapp/requirements.txt

VOLUME ["./data"]

CMD ["/home/web/env/bin/myapp"]

Запуск контейнера Docker, который я пробовал, с флагом «--privileged» и без него, и все равно выдает ту же ошибку.

Спасибо,

1 Ответ

0 голосов
/ 09 июня 2018

Это не связано с docker.Начиная с документа :

Предложение finally всегда выполняется перед выходом из оператора try независимо от того, произошло исключение или нет.

Этолегко проверяемый, b будет существовать независимо:

try:
    a = int(2)
except:
    pass
finally:
    b = 3

print(b)

Так что не имеет смысла close() соединение в блоке finally.Я не вижу смысла закрывать соединение вообще в этой функции, потому что она пыталась сделать только одно: открыть соединение.Либо соединение установлено успешно, либо оно не установлено и поэтому не нуждается в закрытии (действительно, вызов close() в обработчике исключений может вызвать ошибку, поскольку имя conn не будет существовать).

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