Как мне запустить 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 Это хорошо работает для меня, хотя.