Django项目中拒绝docker权限的bash脚本

时间:2019-09-13 15:52:44

标签: django bash shell docker ubuntu

我正在学习docker,并在我的Django项目中实现了docker,目前,它运行良好!完全没有问题

现在,我试图使一些命令易于运行,这就是为什么我编写Shell脚本的原因。

coz,我很无聊地写了这么长的命令:

$ docker-compose run web python /code/manage.py migrate --noinput
$ docker-compose run web python /code/manage.py createsuperuser

和上面类似,为了避免编写冗长的命令,我只是在下面编写了一个shell脚本,如下所示:

manage.sh是shell脚本文件

#!/bin/bash
docker-compose run web python /code/manage.py $1

后来我尝试将manage.sh文件用于migrate,就像

$ ./manage.sh migrate

但是终端抛出一个错误

bash: ./manage.sh: Permission denied

即使我尝试使用sudo

,也没有真正发现问题所在

如果我尝试使用sudo,例如sudo ./docker-manage.sh migrate

它引发了以下错误:sudo: ./docker-manage.sh: command not found

我相信,如果您是Docker专家,就可以解决我的问题。在这种情况下,您能帮我吗?

2 个答案:

答案 0 :(得分:0)

该脚本似乎不可执行。

要解决此问题,请执行以下操作:

chmod u+x ./manage.sh
./manage.sh migrate

未设置可执行权限的示例:

Users-MacBook-Pro:newfol myuser$ ls -l
total 0
-rw-r--r--  1 myuser  staff  0 13 Sep 13:53 manage.sh
Users-MacBook-Pro:newfol myuser$ ./manage.sh
-bash: ./manage.sh: Permission denied
Users-MacBook-Pro:newfol myuser$ chmod u+x manage.sh
Users-MacBook-Pro:newfol myuser$ ./manage.sh
it works

答案 1 :(得分:0)

通常,您要设置容器和图像,以便它们可以完全自主运行。必须像这样反复运行docker-compose run ...,这表明您应该将更多的工作转移到容器的启动中。

Docker容器有两个部分来指定容器运行哪个程序: entrypoint command 。如果同时指定两者,则该命令将作为命令行参数传递给入口点。一种非常典型的模式是使用shell脚本作为入口点,该脚本首先执行所需的任何设置,然后将命令作为最后一个操作运行。

#!/bin/sh
# I am /docker-entrypoint.sh

# Run migrations &c.
python /code/manage.py migrate --noinput
python /code/manage.py createsuperuser

# Run the main container process (our script's arguments)
exec "$@"

然后在您的Dockerfile中,将此脚本指定为ENTRYPOINT,然后将您希望容器实际执行的操作指定为CMD

FROM python:3.7
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

# Assume this copies docker-entrypoint.sh too, and that
# it's marked executable in your local filesystem
COPY . .

EXPOSE 5000

# IMPORTANT: use JSON-array syntax for ENTRYPOINT
ENTRYPOINT ["/app/docker-entrypoint.sh"]

# This is the main thing your container does
# (It could use plain-string syntax if you want)
CMD ["flask", "run", "--host=0.0.0.0"]

(如果您当前已在ENTRYPOINTCMD之间分割默认命令,请将其全部移至CMD。)

您可以做的一件事就是得到一个调试shell。除非您专门覆盖入口点,否则入口点将始终运行,但是可以单独指定命令。因此,如果您想单独查看迁移所做的事情,则可以

sudo docker-compose run web bash

bash将作为参数传递到入口点脚本,该入口点脚本将运行迁移,然后将您放入外壳。