Как мне запустить Docker в Docker на Heroku?

Зачем?
Я пытаюсь создать универсальное решение для запуска docker-compose на Heroku. Я хочу создать решение для развертывания в один клик с помощью развертывания Heroku Button. Таким образом, пользователю не нужны никакие знания о git, Heroku cli и docker.

Эта проблема.
Docker и демон docker доступны только при установке stack в container, Существуют buildpack-пакеты, которые предоставляют docker и docker-compose CLI, но без демона docker вы не сможете запустить образ docker. Так что buildpacks не будут работать.
С stack установлен в container Я могу использовать файл heroku.yml ( статья). Там я определяю свои процессы. (Заменяет Procfile, Если я все еще добавлю Procfile к моему проекту это ничего не даст.)
Я также могу определить Dockerfile там, чтобы построить мой образ докера.
Однако когда я запускаю образ докера, появляется следующая ошибка:

2019-02-28T15:32:48.462101+00:00 app[worker.1]: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
2019-02-28T15:32:48.462119+00:00 app[worker.1]: 
2019-02-28T15:32:48.462122+00:00 app[worker.1]: If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Проблема заключается в том, что внутри контейнера Docker демон Docker не запущен. Решение этого состоит в том, чтобы установить это:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
И так как вы не можете использовать Procfile Я не могу выполнить эту команду. (См выше heroku.yml заменяет Procfile.) И если бы я использовал buildpack, я мог бы использовать Procfile но демон Docker не будет работать.....

Я пытался определить VOLUME в пределах Dockerfile и проблема сохраняется. Кроме того, в статье на heroku говорится: " Монтирование тома не поддерживается. Файловая система dyno эфемерна".

На Heroku можно запустить образ докера. Я борюсь за то, чтобы запустить докер в образе докера.
Запуск докера в образе докера нормально работает на моем VPS при монтировании /var/run/docker.sock но это нельзя (?) сделать на Heroku.

Последние слова: я пытаюсь сделать так, чтобы другие люди могли легко развернуть программное решение, даже если им не нравятся git, heroku cli и docker.

1 ответ

К сожалению, ответ на ваш вопрос: пока нет.

По соображениям безопасности Heroku не предоставляет пользователям возможность запускать привилегированные контейнеры, потому что контейнер может получить доступ к возможностям хоста. В документации довольно четко указаны ваши ограничения, например: Нет --priviledged контейнер и нет root пользователь тоже, нет VOLUMES а диск эфемерный.

Поигравшись с образами DinD для вашего беспокойства, я пришел к выводу, что попытка запустить Docker внутри контейнера Heroku - это неправильный выбор и дизайн. Я почти уверен, что то, что вы пытаетесь достичь, близко к тому, что Heroku предлагает пользователям. Предложение платформы или приложения, где не разработчик может запускать и развертывать приложения с помощью одной кнопки, может быть очень интересным по-разному. И это можно сделать с помощью приложения, использующего их API платформы. В этой ситуации веб-приложение (работающее на Heroku) может (насколько мне известно) не делать то, что вы хотите. Вместо этого вам нужно встроить в настольное приложение: git, docker и ваше приложение для анализа, проверки, создания и отправки ваших приложений / компонентов в реестр контейнеров Heroku.

В конце концов, если вы все еще думаете, какое решение DinD вам нужно, то ваше основное решение для использования VPS - это единственное решение на данный момент. Но имейте в виду, что это может открыть уязвимости безопасности в вашей системе, и вы можете прийти, чтобы предложить что-то похожее на предложение Heroku при попытке ограничить эти защитные двери.

Я не думаю, что на Heroku можно запустить службу, которая может использовать команду docker для запуска какого-нибудь контейнера докеров.

Я хочу создать решение для развертывания в один клик с использованием развертывания Heroku Button.

Я думаю, вы можете обновить ссылку на кнопку "Развернуть" на некоторых из ваших серверов автоматизации (например, экземпляр Jenkins, уже развернутый на Heroku/ другом облаке), чтобы запустить конвейер развертывания и не позволять людям взаимодействовать с git/docker и т. Д.
Но да, вам придется иметь дело с множеством проблем, таких как безопасность, параметр. когда вы не используете популярные решения, такие как Jenkins/CircleCI, а затем разверните...

Что я сделал, так это установил его в свой dockerfile так:

RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz \
  && tar xzvf docker-17.04.0-ce.tgz \
  && mv docker/docker /usr/local/bin \
  && rm -r docker docker-17.04.0-ce.tgz

Затем в разделе args для запуска докера я добавил это:

args '--user root -v /var/run/docker.sock:/var/run/docker.sock'

Для дальнейшего объяснения того, почему это работает, смотрите: /questions/45409980/mozhno-li-zapuskat-docker-iznutri-docker Это хорошо работает для меня, хотя.

Другие вопросы по тегам