docker-compose up完成后显示消息成功

6yjfywim  于 2023-03-29  发布在  Docker
关注(0)|答案(4)|浏览(212)

我在我的docker-compse. yml中运行许多服务。我想显示一条消息,让用户知道何时完成docker-compose?我试图使用命令回显消息,但我的容器退出代码0

command: bash -c "echo Congratulation! You can use your containers now"

是否有任何方式,让用户知道当docker-compose了吗?非常感谢!

huus2vyu

huus2vyu1#

您在CMD中所做的任何事情都将只在日志中可见,并且只在每个服务中可见,因此您最好只查看日志,我认为这是您试图避免的。如果您希望它从本地命令行工作,则需要 Package 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."
e4eetjau

e4eetjau2#

创建一个shell文件echo.sh,其中包含echo“您的消息”
在Docker文件中添加CMD ["/dockerRepo/echo.sh“]

6uxekuva

6uxekuva3#

你有没有试过直接在Dockerfile中运行下面的代码?

RUN echo -e "Your message"
qojgxg4l

qojgxg4l4#

可以使用|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运行,您应该看到

while循环是无限的,但每次迭代都休眠10秒。如果你用这个循环删除行,那么容器将是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

相关问题