我的 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 后,容器已停止。
这是保持容器运行的一种方法吗?
谢谢
答案 0 :(得分:1)
绝对没有:一旦入口点退出,容器就会退出。
您的入口点是一个以exec "$@"
结尾的shell脚本(很好!),这意味着在成功等待数据库启动之后,它将运行docker-compose.yml
中传递的所有内容,例如{ {1}}。 (请注意,如果您在command:
,it ignores a CMD in the Dockerfile中声明了entrypoint:
。)因此,您只需要一个docker-compose.yml
即可启动服务,并且应该设置
command: