【问题标题】:docker-compose yml running a script after updocker-compose yml 启动后运行脚本
【发布时间】:2016-01-05 17:21:55
【问题描述】:

我想在运行后立即运行一个脚本

`docker-compose up -d` 

这是我的 docker-compose.yml 的 sn-p。其他设置是 mysql 服务器,redis...等....但它们没有引起任何问题

web:
  image: nginx
  container_name: web-project
  volumes:
     - ./code:/srv

  working_dir: /srv/myweb
  extra_hosts:
    - "myweb.local:127.0.0.1"
  ports:
   - 8081:80
#  tty: true
  command: sh /srv/scripts/post-run-web.sh

所以每当我运行docker-compose up -ddocker-compose up 时,它都会停止。 (容器不会继续运行)。虽然我的 shell 脚本很简单(运行 echos...或 phpunit)。这是我的脚本。

#!/bin/bash

echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update

这是我得到的错误。就像服务器(nginx)还没有运行。此外,如果我使用 exec bash 连接到服务器,我会检查进程。我没有看到 nginx 正在运行(还)。

web_1      | You are already using composer version 7a9eb02190d334513e99a479510f87eed18cf958.
web_1      | Loading composer repositories with package information
web_1      | Updating dependencies (including require-dev)
web_1      | Generating autoload files
web-project exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping mysql-project... done
Stopping rabbitmq-project... done
Stopping redis-project... done

那么为什么它会退出,尽管脚本在语法上是正确的?我怎样才能让它正确运行? (我在做什么,设置错了!)

【问题讨论】:

  • 您尝试让事情在启动后自动运行还是手动运行正常?你可以使用docker exec $(docker-compose ps -q web) some_command 在已经运行的容器中运行。

标签: bash nginx docker docker-compose


【解决方案1】:

command 覆盖默认命令。

这就是你的容器停止的原因:nginx 永远不会启动。

在脚本结束时,您必须运行 nginx

#!/bin/bash

echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
nginx

顺便说一句,我建议您更改脚本并仅在需要时运行npm installcomposer *update(因此仅当 /src/myweb 中的某些文件不存在时),因为它会使您的容器启动时间增加徒劳的。

请注意,这样做,NginX 将永远不会捕获 docker stop 发送的 SIGTERM 信号。这可能会导致它被突然杀死。

相反,如果你想确保 SIGTERM 被 nginx 接收,你必须将最后一行替换为exec nginx。这会将 bash 进程替换为 nginx 本身。

【讨论】:

  • 您需要将最后一行更改为exec nginx,这意味着您的 bash 脚本将被 nginx 替换,而不是生成一个新进程。这是必需的,因此 docker 可以将 SIGTERM 之类的信号传递给 nginx。更多veithen.github.io/2014/11/16/sigterm-propagation.html
  • 非常好。我将更新答案并添加您的建议。谢谢!
  • 如果脚本序列需要翻转怎么办,我的意思是先运行默认命令,然后触发一些postscript。我在类似的情况下尝试了这种方法:我首先触发了 arangod,一旦它作为服务触发,我在脚本中的部分将永远无法到达,因为服务正在运行。有什么想法吗?
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2018-05-20
  • 2021-12-13
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多