docker volume中的sqlite数据库未打开

时间:2018-06-09 07:48:18

标签: python sqlite

我正在尝试在docker容器中的卷上创建一个sqlite数据库。执行到达c = conn.cursor()时,会收到以下错误:

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容器之外运行,这就是我想知道这是高山还是与docker相关的原因。我的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 :(得分:2)

这与docker无关。来自the docs

  

在离开try语句之前总是执行finally子句,   是否发生了例外。

这很容易测试,b将存在,无论如何:

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

print(b)

因此,对close()块中的finally连接没有意义。我没有看到任何理由在这个函数中完全关闭连接,因为它只尝试做一件事:打开一个连接。连接成功或失败,因此不需要关闭(事实上,在异常处理程序中调用close()可能会抛出错误,因为名称conn将不存在。)