Команда docker run из запущенного контейнера

Когда docker контейнеры начинаешь использовать чуть больше, чем просто запустить hello-world, возникают различные задачи. К примеру одна из таких это получить команду docker run из рабочего контейнера. Это сделать не сложно, вся фишка в ключе —format. Создаем файл run.tpl

 docker run \
 --name={{.Name}} \
 {{range $e := .Config.Env}}--env="{{$e}}" \
 {{end}}{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}-p {{(index $conf 0).HostIp}}:{{(index $conf 0).HostPort}}:{{$p}} \
 {{end}}{{end}}{{range $network, $conf := .NetworkSettings.Networks}}--net {{$network}} \
 --ip {{$conf.IPAddress}} \
 {{end}}{{range $v := .HostConfig.VolumesFrom}}--volumes-from="{{.}}" \
 {{end}}{{range $v := .HostConfig.Binds}}--volume="{{.}}" \
 {{end}}{{range $l, $v := .Config.Labels}}--label "{{$l}}"="{{$v}}" \
 {{end}}{{range $v := .HostConfig.CapAdd}}--cap-add {{.}} \
 {{end}}{{range $v := .HostConfig.CapDrop}}--cap-drop {{.}} \
 {{end}}{{range $d := .HostConfig.Devices}}--device={{(index $d).PathOnHost}}:{{(index $d).PathInContainer}}:{{(index $d).CgroupPermissions}} \
 {{end}}{{range $v := .Config.Entrypoint}}--entrypoint="{{.}}" \
 {{end}}{{with .HostConfig.LogConfig}}--log-driver="{{.Type}}" \
 {{range $o, $v := .Config}}--log-opt {{$o}}="{{$v}}" \
 {{end}}{{end}}{{with .HostConfig.RestartPolicy}}--restart="{{.Name}}{{if eq .Name "on-failure"}}{{.MaximumRetryCount}}{{end}}" \
 {{end}}{{if .Config.Tty}}-t \
 {{end}}{{if .Config.Hostname}}--hostname {{.Config.Hostname}} \
 {{end}}{{if .Config.OpenStdin}}-i \
 {{end}}{{if not (.Config.AttachStdout)}}--detach=true \
 {{end}}{{if .HostConfig.Privileged}}--privileged \
 {{end}}{{if .HostConfig.AutoRemove}}--rm \
 {{end}}{{.Config.Image}} \
 {{range .Config.Cmd}}{{.}} {{end}}

И выполняем команду:

docker inspect --format "$(<./run.tpl)" target-container

На выходе получаем что-то вроде:

docker run \
    --name=/target-container \
    --env="BRANCH_NAME=split-front" \
    --env="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
    --env="TERM=xterm" \
    --env="DEBIAN_FRONTEND=noninteractive" \
    --env="LC_ALL=C.UTF-8" \
    --env="BUS_VERSION=0.14.11" \
    -p 0.0.0.0:80:80/tcp \
    --net internal-test \
    --ip 172.33.0.2 \
    --entrypoint="/bin/sh" \
    --entrypoint="-c" \
    --entrypoint="/entrypoint.sh" \
    --log-driver="json-file" \
    --log-opt max-file="1" \
    --log-opt max-size="50M" \
    --restart="" \
    -t \
    --hostname build4130.app.test.local \
    --detach=true \
    app:4130

Отмечу, что шаблон не универсальный и выводит только ограниченное количество опций, но в моей практике на данный момент этого хватало.

Ошибка epmd rabbitmq в Docker контейнере

На той недели, при разворачивание тестового окружения, столкнулись с проблемой запуска RabbitMQ в Docker контейнере.

Почему-то rabbitmq падал с ошибкой:

ERROR: epmd error for host build189: address (cannot connect to host/port)

Самое интересное, что проблема воспроизводится не всегда, поэтому отловить и отдебажить ее было проблематично.

Запускали rabbitmq следующей командой(выкинул все лишнее):

docker run -d -h build189.rabbitmq.test.local --name rabbitmq rabbitmq

В гугле много раз упоминается данная проблема, но ни одно из решений нам не помогло. Но раз из ошибки следует, что rabbimq не знает хост build189, мы решили добавить его в /etc/hosts завернув его на 127.0.0.1 и больше баг не проявлял себя.
В Docker’e это делается просто:

docker run -d -h build189.rabbitmq.test.local --name rabbitmq --add-host build189:127.0.0.1 rabbitmq