Вам нужно процитировать последнюю половину вашей команды, чтобы 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 обсуждаются способы добавления аргументов и записи вывода.