使用Bash脚本构建/部署Docker
我有一个deploy脚本,我正试图将它用于我的serverforcd,但在编写bash脚本以完成一些必需的步骤(如运行npm和迁移命令)时遇到了问题 如何从这个脚本进入容器bash,运行下面的命令,然后退出以完成更改 以下是我尝试自动化的脚本:使用Bash脚本构建/部署Docker,bash,docker,docker-compose,Bash,Docker,Docker Compose,我有一个deploy脚本,我正试图将它用于我的serverforcd,但在编写bash脚本以完成一些必需的步骤(如运行npm和迁移命令)时遇到了问题 如何从这个脚本进入容器bash,运行下面的命令,然后退出以完成更改 以下是我尝试自动化的脚本: cd /Project docker-compose -f docker-compose.prod.yml down git pull docker-compose -f docker-compose.prod.yml build # all good
cd /Project
docker-compose -f docker-compose.prod.yml down
git pull
docker-compose -f docker-compose.prod.yml build
# all good until here because it opens bash and does not allow more commands to run
docker-compose -f docker-compose.prod.yml run --rm web bash
npm install # should be run inside of web bash
python manage.py migrate_all # should be run inside of web bash
exit # should be run inside of web bash
# back out of web bash
docker-compose -f docker-compose.prod.yml up -d
通常,Docker映像是自包含的,并且知道如何在没有任何用户干预的情况下启动自己。除了一些有限的例外情况,您不需要
docker compose run
interactive shell来进行部署后设置,并且docker exec
应该保留用于紧急调试
在这个脚本中你做了两件事
首先是安装节点包。这些应该被封装在你的图像中;您的Dockerfile几乎总是看起来像
来自节点
WORKDIR/app
复制包*.json。
运行npm ci#您可以很容易地将bash放入容器(exec-it
),但是您必须在容器中有一个bash shell,以便继续从中运行脚本。为什么不直接从Dockerfile执行安装?根本不这样做。在Dockerfile中运行npm install
,使映像包含正确的库树。(如果您的docker compose.yml
在映像的源代码树上装载卷,请将其删除。)您可以docker compose运行一个单独的容器来执行迁移。您可以推迟运行docker compose down
直到docker compose build
完成。有趣的是,因为我使用了webpack,运行npm run build
更改了我的webpack-stats.json文件,所以即使容器已生成并交换,在生成之前仍有500个错误。。。自然地,您的解决方案是强制的,因此我可以正确地自动化构建。现在看,这是我应该一直做的,谢谢!
docker-compose run web \
python manage.py migrate_all