Неожиданное поведение при использовании сценария оболочки для запуска команды в оболочке python - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать скрипт для начальной настройки суперпользователя в django. У меня есть docker контейнер, работающий django.

docker exec -it "mydockername" bash -c echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')" | python manage.py shell

Этот скрипт выдает ошибку

      File "manage.py", line 16
    ) from exc
         ^
SyntaxError: invalid syntax

Но если я выполню команду

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')" | python manage.py shell

внутри контейнера docker У меня нет проблем, и суперпользователь создан.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вам нужно процитировать последнюю половину вашей команды, чтобы bash -c получил один аргумент. Это усложняет всю команду (поскольку она уже использует одинарные и двойные кавычки), но это выглядело бы как

docker exec -it "mydockername" \
  bash -c "echo \"from django.contrib.auth import ...\" | python manage.py shell"

Без этого ваша локальная оболочка получает первый удар при выделении команды и он видит

docker exec ... | python manage.py shell

И, кроме того, поскольку bash -c принимает только один аргумент, команда запускается внутри контейнера:

bash -c echo  # with another argument that gets ignored

Вероятно, вы можете запустить эту команду прямо на вашем хост (без docker exec). Вам нужно будет написать альтернативный файл settings.py, который будет указывать на Docker -хостовую базу данных (имя хоста базы данных будет localhost и его порт, который будет опубликован через ports:), и тогда эти настройки могут достичь база данных внутри контейнера.

Вероятно, лучший путь здесь - избежать написания сценария Python, выполняемого с помощью команды оболочки в кавычках, запускаемой через docker exec. Напишите небольшой скрипт расширения, как описано в Django документации Написание пользовательских django-admin команд страница:

from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
class CreateSuperuser(BaseCommand):
  def handle(self, *args, **options):
    User = get_user_model()
    User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')

Поместите это в management/commands/superuser.py, и вы сможете запустить python manage.py superuser (потенциально через docker exec). В документации Django обсуждаются способы добавления аргументов и записи вывода.

1 голос
/ 06 апреля 2020

Попробуйте это:

docker exec -it "mydockername" bash -c "echo \"from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('root3', 'admin3@myproject.com', 'root3')\" | python manage.py shell"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...