Когда 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
Отмечу, что шаблон не универсальный и выводит только ограниченное количество опций, но в моей практике на данный момент этого хватало.