Alpine: дождитесь запуска докера, прежде чем продолжить - PullRequest
0 голосов
/ 10 января 2019

Я использую Alpine Linux для своей машины CI / CD. Файл докера ниже:

FROM node:10.15-alpine
RUN npm i -g sequelize sequelize-cli mysql2
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk update
RUN apk add --update git bash openssh terraform aws-cli docker openrc
WORKDIR /var/app

Проблема в том, что CI пытается выполнить код докера, например. docker login, не получается:

[Container] 2019/01/10 11:18:10 Running command $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
 [Container] 2019/01/10 11:18:10 Command did not exit successfully $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) exit status 1

Когда я пытаюсь добавить строку

RUN service docker start

У меня уже запускается докер

Как я могу ждать запуска докера?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Обдумайте ответ @DavidMaze, предположительно, DinD не правильный путь, но я думаю, что это кажется более легким ... кроме того, я нашел документы на AWS о том, как заставить это работать.

https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker-custom-image.html

Основные моменты, которые я узнал: мне нужно включить привилегированный режим в CodeBuild, а затем в моей сборочной спецификации мне нужно сделать:

phases:
  install:
    commands:
      - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
      - timeout -t 15 sh -c "until docker info; do echo .; sleep 1; done"

0 голосов
/ 10 января 2019

Ничто из того, что вы показываете, на самом деле не запускает демон Docker (кроме того, который работает на хосте).

Попытка запустить Docker в Docker - сложная и обычно не рекомендуемая установка. Давний разработчик Docker особо рекомендует не использовать его для CI ; есть предустановленное докер изображение, где начинается самое первое предложение официального описания изображения

Хотя запуск Docker внутри Docker, как правило, не рекомендуется ....

Показываемый вами Dockerfile не содержит директиву ENTRYPOINT или CMD. Это означает, что он унаследует его от узла , для которого по умолчанию CMD просто выполняет node. Короче говоря: когда вы запускаете этот образ, если вы не укажете что-либо еще в командной строке, он запустит интерактивную оболочку Node.js, а не любые не связанные инструменты, которые вы вложили в одно и то же изображение. В частности, он не запустит демон Docker.

Помещение RUN service ... start в ваш Dockerfile не поможет вам по нескольким причинам. Один из них заключается в том, что образы Docker содержат только содержимое файловой системы, а не запущенные процессы, поэтому после завершения шага RUN больше ничего не выполняется. Некоторые системы инициализации (особенно systemd) зависят от взаимодействия с процессом init, который также не будет запущен, поэтому особенно systemctl в Docker почти никогда не работает. С архитектурной точки зрения обычно лучше запускать один процесс в контейнере (поэтому docker stop остановит интересующий вас процесс, и поэтому Docker заметит, что процесс завершится сбоем, а также для масштабирования и ...), поэтому вы почти никогда не должны использовать service, initctl или systemctl в Docker.

Общий совет для инструментов CI заключается в том, чтобы связать монтируемое гнездо Docker хоста (docker run -v /var/run/docker.sock:/var/run/docker.sock) и позволить ему создавать образы и запускать контейнеры самостоятельно, принимая во внимание последствия для безопасности.

...