我在我的docker-compse. yml中运行许多服务。我想显示一条消息,让用户知道何时完成docker-compose?我试图使用命令回显消息,但我的容器退出代码0
command: bash -c "echo Congratulation! You can use your containers now"
是否有任何方式,让用户知道当docker-compose了吗?非常感谢!
huus2vyu1#
您在CMD中所做的任何事情都将只在日志中可见,并且只在每个服务中可见,因此您最好只查看日志,我认为这是您试图避免的。如果您希望它从本地命令行工作,则需要 Package docker-compose up命令。
docker-compose up
***以下内容未经全面测试。仅供参考。***我自己使用getContainerHealth和waitContainer脚本,因此***可以***为它们担保。我相当肯定我在这个网站上找到了它们,但不记得在哪里。
假设您正在等待服务处于可用状态,您可以使用类似于以下compose文件的内容:docker-compose.yml
services: serviceOne: // ... the usual stuff container_name: serviceOne healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s timeout: 10s retries: 3 start_period: 1s serviceTwo: // ... the usual stuff container_name: serviceTwo healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s start_period: 1s
测试中的命令是用于定义服务是否已启动并正在运行的命令。更多信息请访问:https://docs.docker.com/compose/compose-file/#healthcheck您可能需要对生产和开发进行不同的健康检查(或者至少是interval、timeouts、start_periods等)。然后使用一些bash脚本来代替docker-compose up:
getContainerHealth () { docker inspect --format "{{json .State.Health.Status }}" $1 } waitContainer () { while STATUS=$(getContainerHealth $1); [ $STATUS != "\"healthy\"" ]; do if [ $STATUS = "\"unhealthy\"" ]; then echo "Failed!" exit -1 fi printf . lf=$'\n' sleep 1 done printf "$lf" } waitContainers () { waitContainer serviceOne waitContainer serviceTwo // ... for all services } docker-compose up echo "In progress. Please wait" waitContainers echo "Done. Ready to roll."
e4eetjau2#
创建一个shell文件echo.sh,其中包含echo“您的消息”在Docker文件中添加CMD ["/dockerRepo/echo.sh“]
6uxekuva3#
你有没有试过直接在Dockerfile中运行下面的代码?
RUN echo -e "Your message"
qojgxg4l4#
可以使用|和while循环
|
while
version: "3.9" services: cmd: container_name: my-node-cmd-1 image: node:16.10.0 volumes: - .:/work command: - bash - -c - | echo "----------------------------------------------" echo "To join to CMD, in separate console execute:" echo " " echo 'docker exec -it my-node-cmd-1 bash -c "cd /work; bash"' while true; do sleep 10000; done
上面的工作示例提供了对当前目录中的节点cmd的访问-如果您将其复制到docker-compose.yml并由docker compose up运行,您应该看到
docker-compose.yml
docker compose up
while循环是无限的,但每次迭代都休眠10秒。如果你用这个循环删除行,那么容器将是exit with code 0奖金您可以通过在以下脚本中使用run而不是up来获得与上面示例类似的效果
exit with code 0
run
up
version: "3.9" services: # run this container by: docker compose run cmd cmd: image: node:16.10.0 volumes: - .:/work command: - bash - -c - | echo "Hello World!" cd /work bash
4条答案
按热度按时间huus2vyu1#
您在CMD中所做的任何事情都将只在日志中可见,并且只在每个服务中可见,因此您最好只查看日志,我认为这是您试图避免的。如果您希望它从本地命令行工作,则需要 Package
docker-compose up
命令。***以下内容未经全面测试。仅供参考。***我自己使用getContainerHealth和waitContainer脚本,因此***可以***为它们担保。我相当肯定我在这个网站上找到了它们,但不记得在哪里。
假设您正在等待服务处于可用状态,您可以使用类似于以下compose文件的内容:
docker-compose.yml
测试中的命令是用于定义服务是否已启动并正在运行的命令。更多信息请访问:https://docs.docker.com/compose/compose-file/#healthcheck
您可能需要对生产和开发进行不同的健康检查(或者至少是interval、timeouts、start_periods等)。
然后使用一些bash脚本来代替docker-compose up:
e4eetjau2#
创建一个shell文件echo.sh,其中包含echo“您的消息”
在Docker文件中添加CMD ["/dockerRepo/echo.sh“]
6uxekuva3#
你有没有试过直接在Dockerfile中运行下面的代码?
qojgxg4l4#
可以使用
|
和while
循环上面的工作示例提供了对当前目录中的节点cmd的访问-如果您将其复制到
docker-compose.yml
并由docker compose up
运行,您应该看到while
循环是无限的,但每次迭代都休眠10秒。如果你用这个循环删除行,那么容器将是exit with code 0
奖金
您可以通过在以下脚本中使用
run
而不是up
来获得与上面示例类似的效果