我有一个django项目的repo,想要从中创建一个Docker镜像。我也不想在git中存储任何已编译的文件,所以我尝试在Docker镜像创建过程中自动创建所有工件。
如果我插入:
RUN python manage.py compilemessages -l en
在我的Dockerfile中我得到(注意所有依赖项都安装在主机上):
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
所以它不会调用db后端?
django版本:1.8
答案 0 :(得分:0)
您的问题是,运行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
答案 1 :(得分:0)
使用django-admin
代替manage.py
:
RUN django-admin compilemessages -l en