我在Docker容器中运行gitlab,它很好地把它的依赖关系(MySQL,Redis,Mailserver)分离到不同的docker容器中。 运行它们不是问题,我以相反的顺序启动它们:首先是依赖关系,而不是gitlab本身。
有时我不得不重新启动docker主机。 目前我SSH入泊坞窗主机,并手动重新启动容器。 有没有更好的办法呢? 像只是告诉一些服务来启动gitlab容器,它首先照顾启动它的依赖关系? 我知道我可以为每个Docker容器创build单独的初始化脚本,但这不是我正在寻找的。
您甚至可能想要查看“官方” 无花果项目,该项目现在已经被Docker Compose取代。 这应该是相当容易configuration/设置。
运行gitlab的用例基本上与Fig – WordPress示例相同,或者使用gitlab-compose脚本
如果您在Mac上工作,您可能需要查看包含Compose的Docker工具箱 ,还需要其他各种快速启动和运行的工具!
我想你可以看看装饰
你也可以用CoreOS的方式来pipe理依赖关系。 通过为主gitlab容器编写一个Unit文件,如:
[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.serice是MySQL容器的Unit文件, redis.service是Redis的一个,等等
如果有人发现这个有用的,我写了一个鱼壳脚本(应该很容易移植到bash ),使用docker inspect来启动我的容器的所有依赖关系。 这里是代码,使用jq来parsingjson:
#!/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_links_lookup函数:
docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start
编辑:
我开始在上面的脚本中使用的另一个方便的function是这样的:
# 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
它不是只启动一个容器,而是查找容器公开的端口,并testing它是否可以连接到它们。 如果你有像数据库容器这样的东西,它可以在启动时执行清理,因此需要一些时间才能在networking上实现。 像这样使用它:
start_and_wait {{container_name}}
或者如果你正在使用上面的脚本,用这个replace最后一行:
start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)
最后一行将确保所有容器只在依赖关系之后启动,同时等待依赖关系实际完成启动。 请注意,这可能不适用于每个设置,因为有些服务器可能会立即打开它们的端口,但实际上并没有准备好(尽pipe我不知道有任何服务器实际执行此操作,但这是Docker开发人员在询问时给出的原因他们关于这样的function)。