Bash 如何在docker compose中有条件地运行命令
我想在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
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上下文中,它告诉它用命令替换自身(来自DockerfileCMD
语句或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