【问题标题】:bash script for docker permission denied in django projectdjango项目中拒绝docker权限的bash脚本
【发布时间】:2020-01-15 12:26:04
【问题描述】:

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

现在我正在尝试让一些命令易于运行,这就是我编写 shell 脚本的原因。

因为,我很无聊写这个太长的命令:

$ 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 专家,你可以解决我的问题。在这种情况下你能帮帮我吗?

【问题讨论】:

  • 使用 sudo ./manage.sh migrate
  • 脚本文件是否可执行? (chmod +x manage.sh 有帮助吗?)
  • 我已经用sudo试过了,但是没有运气,仔细阅读帖子
  • 是的,它有助于 chmod +x manage.sh
  • 它解决了我的问题,但是每次运行 chmod +x manage.sh 这个命令很无聊,还有其他解决方案吗?

标签: django bash shell docker ubuntu


【解决方案1】:

通常,您希望设置容器和映像,以便它们可以完全自主地运行。必须像这样重复运行 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。)

您可以用它做的一件事是获得一个调试外壳。入口点始终运行,除非您专门覆盖它,但您可以单独指定命令。因此,如果您想单独查看迁移的作用,您可以

sudo docker-compose run web bash

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

【讨论】:

    【解决方案2】:

    该脚本似乎不可执行。

    你应该做的是解决这个问题:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-07
      • 2015-04-09
      • 1970-01-01
      • 2016-12-17
      • 2012-06-19
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多