在Dockerfile中运行“manage.py compilemessages”会显示“django.db.utils.OperationalError:could not connect to server:No such file or directory”(django. db.utils.OperationalError:无法连接到服务器:没有这样的文件或目录)

kb5ga3dv  于 2023-11-17  发布在  Docker
关注(0)|答案(3)|浏览(92)

我有一个django项目的repo,想从它创建一个Docker镜像。我也不想在git中存储任何编译后的文件,所以我尝试在创建Docker镜像的过程中自动创建所有工件。如果我在我的Dockerfile中插入:RUN python manage.py compilemessages -l en,我会得到(注意所有依赖项都安装在主机上):

Traceback (most recent call last):
  File "manage.py", line 13, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 312, in execute
    django.setup()
  File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 115, in populate
    app_config.ready()
  File "/src/playpilot/apps.py", line 21, in ready
    for ct in ContentType.objects.all():
  File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
...

File "/usr/local/lib/python2.7/site-packages/psycopg2/__init__.py", line 164, in connect
    conn = _connect(dsn, connection_factory=connection_factory, async=async)
django.db.utils.OperationalError: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

字符串
我通过在构建脚本中运行docker-compose来解决这个问题(使用整个运行环境)

docker-compose up -d
docker-compose exec web ./manage.py compilemessages -l en
docker commit proj_web_1 image_name
docker-compose down


但这增加了构建时间,看起来是一个相当丑陋的解决方案。
manage.py不需要连接到数据库来执行这个特定的任务。有没有一种方法可以运行manage.py,这样它就不会调用数据库后端?
Django版本:1.8

qjp7pelc

qjp7pelc1#

使用django-admin代替manage.py

RUN django-admin compilemessages -l en

字符串

4bbkushb

4bbkushb2#

您的问题是,当您运行collectstatic时,postgres容器已启动,但postgres本身尚未启动。阅读https://docs.docker.com/compose/startup-order/了解更多信息
你基本上需要做的是设置ENTRYPOINT,同时检查postgres是否准备好接受连接,这里是我在项目中如何做的例子。

#!/bin/sh
# NOTE: if there is no bash can cause
# standard_init_linux.go:190: exec user process caused "no such file or directory"

# https://docs.docker.com/compose/startup-order/
set -euo pipefail

WAIT_FOR_POSTGRES=${WAIT_FOR_POSTGRES:-true}

if [[ "$WAIT_FOR_POSTGRES" = true ]]; then
    DATABASE_URL=${DATABASE_URL:-postgres://postgres:postgres@postgres:5432/postgres}

    # convert to connection string
    # https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
    POSTGRES_URL=${DATABASE_URL%%\?*}
    # https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
    POSTGRES_URL=${POSTGRES_URL/#postgis:/postgres:}

    # let postgres and other services (e.g. elasticsearch) to warm up...
    # https://www.caktusgroup.com/blog/2017/03/14/production-ready-dockerfile-your-python-django-app/
    until psql $POSTGRES_URL -c '\q'; do
        >&2 echo "Postgres is not available - sleeping"
        sleep 1
    done
    # >&2 echo "Postgres is up - executing command"
fi

if [[ $# -ge 1 ]]; then
    exec "$@"
else
    echo "Applying migrations"
    python manage.py migrate --noinput -v 0
    echo "Generate translations"
    python manage.py compilemessages --locale ru -v 0
    echo "Starting server"
    exec python manage.py runserver 0.0.0.0:8000
fi

字符串

np8igboo

np8igboo3#

尝试添加到dockerfile
运行apt-get update && apt-get install -y gettext libgettextpo-dev

相关问题