【问题标题】:manage.py collectstatic: error: unrecognized arguments: --noinput in shell script launched by Dockermanage.py collectstatic:错误:无法识别的参数:Docker启动的shell脚本中的--noinput
【发布时间】:2016-11-20 07:38:16
【问题描述】:

我正在通过 shell 脚本在 Docker 容器中启动 django-tornado 混合应用程序,并将 --noinput 作为 django 命令的无法识别参数:

usage: manage.py collectstatic [-h] [--version] [-v {0,1,2,3}]
                               [--settings SETTINGS] [--pythonpath PYTHONPATH]
                               [--traceback] [--no-color] [--noinput]
                               [--no-post-process] [-i PATTERN] [-n] [-c] [-l]
                               [--no-default-ignore]
manage.py collectstatic: error: unrecognized arguments: --noinput

为什么我会得到 --noinput 作为一个无法识别的参数?我的 Dockerfile 调用了一个部署 shell 脚本,该脚本执行 collectstaticmigrate 命令(都带有 --noinput 参数,这对两者都失败了。我已经尝试过删除无关的行,调整命令周围的空格等, 无济于事。我可以在本地运行 shell 脚本没有任何问题;这似乎只是 Docker 容器 RUN 调用 shell 脚本中的问题。

Dockerfile:

FROM python:2.7

RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y python-dev
RUN apt-get install -y libmysqlclient-dev

RUN mkdir /code
ADD . /code/
WORKDIR /code
RUN pip install -r requirements.txt

CMD ["sh","./deploy.sh"]

EXPOSE 8888

部署.sh:

#!/bin/sh
python manage.py collectstatic --noinput
python manage.py migrate --noinput
python main.py

如果我在 Dockerfile 中使用 RUN python manage.py collectstatic --noinput 运行 django 命令,则没有问题,但我正在尝试在 CMD 调用中获取特定于应用程序的命令,因为我需要来自 Elastic 的数据库环境变量Beanstalk 用于我的部署环境。

【问题讨论】:

    标签: python django docker


    【解决方案1】:

    问题是windows中的行分隔符,默认情况下它需要CRLF。所以你需要把它改成LF。这取决于您使用的编辑器,您可以将其更改为 LF。 对于 Visual Studio 代码(Vscode),按 ctrl + shift + P 打开搜索托盘并输入“更改行尾序列”,您将看到选择 LF/CRLF 的选项,请从该选项中选择 LF(尝试使用相同的 .sh您遇到问题的文件)并再次保存文件。

    您可以选择从 VSCode 的右下方选择相同的选项来执行相同的过程

    对于其他编辑,您可以搜索并遵循相同的过程

    【讨论】:

      【解决方案2】:

      我用notepad++解决了这个问题

      在你的记事本++中

      Do Inspection
      View > Show Symbol > Show All Characters
      Look for CR LF line endings, rather than LF line endings!
      
      Solving
      Search > Replace (Ctrl+H)
      Make sure Search Mode is set to Extended
      Find \r\n and replace with \n
      

      这种情况下的主要问题是您的 sh 文件中有 CR aka 回车

      【讨论】:

        【解决方案3】:

        看起来我的问题是 shell 脚本中的行尾。我认为 sh 正在将--noinput\R 输入 python,因此它在终端中将自己呈现为看起来像 --noinput,但实际上它也得到了一个匹配的 CR 字符。

        当我在本地测试时,它在 Docker Quickstart 终端中(它工作的地方),而 Docker 容器总是在 Ubuntu 中运行(它失败了)。

        我过去曾遇到过这种情况,以前在 Windows 上编写的 shell 脚本中的不同行尾会在 Linux 环境中搞砸,我需要记住在我的文件中正确设置行尾是多么重要编辑...

        【讨论】:

        • 有什么办法吗?我无法弄清楚。
        • 确保您的编辑器没有在 shell 脚本中插入 CR 字符。如果您的版本控制软件配置正确,它应该确保签入/签出具有正确的行尾。我添加到我的.gitattributes 文件* text=auto*.sh text eol=lf。但是,如果您的编辑器仍在添加 CRLF 而不仅仅是 LF,那么它本身并不能解决问题,这是我的大问题。
        • 感谢您的回复。下次我会记住这一点
        • 遇到了同样的问题,问题是行尾。我的开发环境是 Windows,我部署到 Linux 环境。我正在使用 Pycharm,Configuring Line Separators 帮助了我。
        • 我在 Sublime Text 和 set line endings to Unix 中编辑了文件。
        猜你喜欢
        • 2016-10-01
        • 2020-03-01
        • 1970-01-01
        • 2017-11-19
        • 2017-05-21
        • 2020-10-17
        • 1970-01-01
        • 2019-08-15
        • 2020-07-21
        相关资源
        最近更新 更多