AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 637585
Accepted
DASKAjA
DASKAjA
Asked: 2014-10-17 08:44:44 +0800 CST2014-10-17 08:44:44 +0800 CST 2014-10-17 08:44:44 +0800 CST

自动启动 docker 容器的链接依赖

  • 772

我在docker 容器中运行 gitlab,它将其依赖项(MySQL、Redis、Mailserver)很好地分离到单独的 docker 容器中。运行它们不是问题,我以相反的顺序启动它们:首先是依赖项,然后是 gitlab 本身。

有时我必须重新启动 docker 主机。目前我 ssh 进入 docker 主机并手动重启容器。有更好的方法吗?就像只是告诉一些服务启动 gitlab 容器并首先启动它的依赖项?我知道我可以为每个 docker 容器创建单独的初始化脚本,但这不是我想要的。

startup
  • 3 3 个回答
  • 7602 Views

3 个回答

  • Voted
  1. Glueon
    2014-10-17T08:58:37+08:002014-10-17T08:58:37+08:00

    我想你可以看看Decking

    您还可以通过 CoreOS 的方式管理依赖项。通过为您的主容器编写一个Unit文件,例如:gitlab

    [Unit]
    ...
    Requires=docker.service
    Requires=redis.service
    Requires=mysql.service
    ...
    [Service]
    TimeoutStartSec=0
    ExecStartPre=-/usr/bin/docker kill gitlab
    ExecStartPre=-/usr/bin/docker rm gitlab
    ExecStart=/usr/bin/docker run --name gitlab gitlab
    ExecStop=/usr/bin/docker stop gitlab
    

    MySQL 容器、Redis 容器等的mysql.serice文件在哪里?Unitredis.service

    • 2
  2. Best Answer
    Gekkie
    2014-11-05T04:04:35+08:002014-11-05T04:04:35+08:00

    您甚至可能想查看“官方”的Fig项目,该项目现已被Docker Compose取代。配置/设置应该相当容易。

    您运行 gitlab 的用例与Fig - Wordpress 示例或使用gitlab-compose 脚本基本相同

    如果你在 Mac 上工作,你可能想看看Docker 工具箱,其中包括 Compose,还有其他各种快速启动和运行的工具!

    • 2
  3. milch
    2015-08-12T06:37:03+08:002015-08-12T06:37:03+08:00

    万一有人觉得这很有用,我写了一个fishshell 脚本(应该很容易移植到bash),docker inspect用来启动我的容器的所有依赖项。这是代码,使用jq解析json:

    #!/usr/local/bin/fish
    
    # Start all containers
    
    # Returns all the dependencies of the input + the input, eg. [dep1, dep2, input]
    function docker_links_lookup
        set result (docker inspect $argv[1] | jq ".[0].HostConfig.Links" | pcregrep -o1 "\"/(.*):.*\"")
        for x in $result 
            docker_links_lookup $x
            echo $x
        end
    end
    
    # Returns all docker containers in the current directory, including their dependencies
    function all_docker_containers 
        for dir in */
            if test -f "$dir/Dockerfile"
                set container_name (echo $dir | sed "s/\///") #remove trailing /
                docker_links_lookup $container_name
                echo "$container_name"
            end
        end
    end
    
    # Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that order
    all_docker_containers | awk '!seen[$0]++' | xargs docker start
    

    请注意,此代码假定当前目录中有对应于同名 docker 容器的子目录。它也不处理循环依赖(我不知道其他工具是否有),但它也是在半小时内编写的。如果您只有一个容器,您只需使用如下docker_links_lookup函数:

    docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start
    

    编辑:

    我在上述脚本中开始使用的另一个方便的功能是:

    # This starts the docker containers that are passed in, and waits on the ports they expose
    function start_and_wait
        for container in $argv
            set ports (docker inspect $container | jq ".[0].Config.ExposedPorts | keys" 2>/dev/null | egrep -o "[0-9]+" | xargs)
            docker start $container
            docker run -e PORTS="$ports" --link $container:wait_for_this n3llyb0y/wait > /dev/null
        end
    end
    

    它不只是启动一个容器,而是查找容器公开的端口,并测试它是否可以连接到它们。如果您有诸如数据库容器之类的东西,它可能会在启动时执行清理,因此需要一些时间才能在网络上实际可用。像这样使用它:

    start_and_wait {{container_name}}
    

    或者,如果您使用的是上述脚本,请将最后一行替换为:

    start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)
    

    最后一行将确保所有容器仅在其依赖项之后启动,同时还等待依赖项实际完成启动。请注意,这可能不适用于每个设置,因为某些服务器可能会立即打开它们的端口,而实际上并没有准备好(尽管我不知道任何服务器实际上会这样做,但这就是 docker 开发人员在询问时给出的原因他们关于这样的功能)。

    • 2

相关问题

  • 通过远程桌面登录 Windows Vista 时阻止某些启动程序运行

  • Jetty 7 给出 HTTP 错误:503 - 服务不可用

  • 如何禁用 OSX 启动声​​音?[关闭]

  • Windows XP 挂在登录屏幕上

  • 单人 ISV,您推荐哪种类型的服务器硬件?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve