Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在docker compose中有条件地运行命令_Bash_Docker_Syntax_Docker Compose_Dockerfile - Fatal编程技术网

Bash 如何在docker compose中有条件地运行命令

Bash 如何在docker compose中有条件地运行命令,bash,docker,syntax,docker-compose,dockerfile,Bash,Docker,Syntax,Docker Compose,Dockerfile,我想在docker compose中有条件地运行命令 因为当某人第一次运行此应用程序时 他们必须运行migrate命令才能正确运行django应用程序 但是,如果他们的docker已经运行了migrate,则无需再次运行migrate 因此,这是检查他们的docker是否已运行migrate的命令 if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then echo 'no need t

我想在docker compose中有条件地运行命令

因为当某人第一次运行此应用程序时

他们必须运行
migrate
命令才能正确运行
django
应用程序

但是,如果他们的docker已经运行了
migrate
,则无需再次运行
migrate

因此,这是检查他们的docker是否已运行
migrate
的命令

    if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then
        echo 'no need to migrate'
    else
        echo 'need to migate'
    fi
这是我的码头工人

version: '3'

services:
  db:
    image: postgres
  web:
    command: >
         bash -c "if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then
               echo 'no need to migrate'
            else
               echo 'need to migate'
            fi && python3 zeus/manage.py runserver 0.0.0.0:8000
         "
但是错误是这样发生的

ERROR: Invalid interpolation format for "build" option in service 
"web": "bash -c "if [[ -z $(python3 zeus/manage.py showmigrations | grep '\[ \]')]]; then 
echo 'no need to migrate' else echo 'need to migate' fi 
&& python3 zeus/manage.py runserver 0.0.0.0:8000""
有什么想法吗

编辑 当我在普通bash中运行检查迁移的脚本时,这很好

我认为docker compose无法解析
$(python3 manage.py…)
部分。

尝试以下方法:

version: '3'

services:
  db:
    image: postgres
  web:
    command: bash -c "if [[ -z $$(python3 zeus/manage.py showmigrations | grep '\\[ \\]') ]]; then
               echo 'no need to migrate';
            else
               echo 'need to migate';
            fi && python3 zeus/manage.py runserver 0.0.0.0:8000"

有三个问题,您需要使用转义字符
\
,并添加更多
$
以转义compose中的重放,并在最后一个
]]之前再添加一个空格。

尽量避免在
docker compose.yml
中编写复杂的脚本,特别是当它们用于应用程序设置的正常部分时

典型的模式是将这种设置放在入口点脚本中。该脚本以shell命令
exec“$@”
结束。在Docker上下文中,它告诉它用命令替换自身(来自Dockerfile
CMD
语句或Docker Compose
命令:
)。对于您的示例,这可能看起来像

#/垃圾箱/垃圾箱
如果[-z$(python3-zeus/manage.py showmigrations | grep'\[\]');然后
echo“无需迁移”
其他的
echo“需要混合”
fi
执行官“$@”
然后在Dockerfile中,复制此文件并将其指定为
入口点
;不修改运行应用程序的
CMD

COPY entrypoint.sh /app
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]
CMD python3 zeus/manage.py run --host=0.0.0.0:8000
ENTRYPOINT
语句必须是JSON数组形式,并且不能包含显式的
sh-c
包装器

如果您想验证设置是否正确,可以运行

docker-compose run web sh

在迁移和其他安装程序运行之后,您将得到一个shell,而不是主服务器进程。

添加一个shebang,然后将bash脚本粘贴到那里:在bash中运行该脚本时,这很好。但是,这个错误发生在docker-compose.ymlf中。首先,您需要在最后一个
]]
之前添加一个sapce。没有出现像
这样的错误,服务中的“build”选项的插值格式无效,但是会发生像这样的错误:
web|1 | bash:-c:第1行:语法错误:文件意外结束
,但我运气不好。我可以共享撰写文件的代码。不管怎样,我很感激你的回答。这对我有帮助。谢谢,没有出现错误,但它会打印诸如
无需迁移或echo需要迁移之类的消息。它似乎不适用于
if语句
properlyand on”;“在
echo“无需迁移”之后”
:我在Dockerfile中尝试了此脚本。但是Dockerfile无法识别在compose中定义的主机名
db
。因此,我无法运行
migrate
命令,因为
migrate
命令与主机名有关
db