docker-compose在运行入口点后保持容器运行

时间:2018-12-02 10:14:48

标签: docker build docker-compose

我的 docker-compose.yml

version: '3.1'
services:
    redis:
      container_name: redis
      image: redis:3.0
    app_prod:
      container_name: app_prod
      build:
        dockerfile: .docker/app/prod.Dockerfile
        context: ./../
      ports:
          - "8080:80"
      links:
        - mysql:mysql
        - redis:redis
      depends_on:
        - mysql
        - redis
      environment:
        PRODUCTION_MODE: 'true'
      entrypoint: .docker/app/sh/entry-point.sh
    mysql:
      image: mysql
      command: --default-authentication-plugin=mysql_native_password
      restart: always
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: 'my-db'
      build:
        context: ./mysql # path to folder containing Dockerfile

我的 .docker / app / sh / entry-point.sh

#!/usr/bin/env bash
set -e # exit script if any command fails (non-zero value)
echo Waiting for redis service start...;

while ! nc -z redis 6379;
do
sleep 1;
done;

echo Waiting for mysql service start...;

while ! nc -z mysql 3306;
do
sleep 1;
done;
echo Connected!;

php www/index.php orm:schema-tool:update --force

exec "$@"

我正在通过命令进行构建:

docker-compose -f .docker/docker-compose-prod.yml up -d --build

所有容器均已成功构建,但最终正在运行容器 app_prod .docker / app / sh / entry-point.sh < / em>)。入口点脚本也已成功处理,但在执行入口点脚本 app_prod 后,容器已停止。

这是保持容器运行的一种方法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

绝对没有:一旦入口点退出,容器就会退出。

您的入口点是一个以exec "$@"结尾的shell脚本(很好!),这意味着在成功等待数据库启动之后,它将运行docker-compose.yml中传递的所有内容,例如{ {1}}。 (请注意,如果您在command:it ignores a CMD in the Dockerfile中声明了entrypoint:。)因此,您只需要一个docker-compose.yml即可启动服务,并且应该设置

command: