docker-compose yml在运行后运行脚本

Con*_*nce 34 bash nginx docker docker-compose

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

`docker-compose up -d` 
Run Code Online (Sandbox Code Playgroud)

这是我的片段docker-compose.yml.其他设置是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
Run Code Online (Sandbox Code Playgroud)

所以每当我跑步 docker-compose up -d或者 docker-compose up一切都停止.(容器不能继续运行).虽然我的shell脚本很简单(运行echos ...或phpunit).这是我的剧本.

#!/bin/bash

echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
Run Code Online (Sandbox Code Playgroud)

这就是我得到的错误.就像服务器(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
Run Code Online (Sandbox Code Playgroud)

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

nes*_*uno 32

命令会覆盖默认命令.

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

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

#!/bin/bash

echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
nginx
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我建议你改变你的脚本并运行npm install,composer *update只有在需要时(因此只有当/ src/myweb中的某个文件不存在时),因为它会使你的容器启动时间徒劳无功.

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

相反,如果你想确保nginx收到SIGTERM,你必须用最后一行替换exec nginx.这用nginx本身取代了bash过程.

  • 您需要将最后一行更改为`exec nginx`,这意味着您的bash脚本将被nginx代替,而不是生成新进程。这是必需的,因此docker可以将SIGTERM之类的信号传递给nginx。有关更多信息,请参见http://veithen.github.io/2014/11/16/sigterm-propagation.html (3认同)