Создание собственного образа сборки для AWS CodeBuild с помощью docker-compose

Я пытаюсь создать собственное изображение докера, чтобы использовать его в качестве образа сборки с помощью AWS CodeBuild. Он отлично работает, если я просто делаю docker build против Dockerfile с настроенной средой. Но теперь мне нужно добавить экземпляр postgres для запуска тестов. Поэтому я подумал, что использование docker-compose поможет. Однако я не могу понять, как заставить его работать. Вроде как статическая часть композиции (изображение из Dockerfile) просто сразу останавливается при попытке docker-compose up, так как точки входа нет. На данный момент я могу подключиться к экземпляру БД, запустив docker-compose run db psql -h db -U testdb -d testdb. Но когда я создаю и передаю его сценарию, предоставленному AWS, он работает нормально, пока мои тесты не попытаются достичь сервера БД. Здесь он терпит неудачу с тайм-аутом, как если бы не было экземпляра БД.

Конфиги выглядят так:

version: '3.7'

services:
  api-build:
    tty: true
    build: ./api_build
    image: api-build
    depends_on:
      - db

  db:
    image: postgres:10-alpine
    restart: always
    environment:
      POSTGRES_USER: testdb
      POSTGRES_PASSWORD: testdb

И Dockerfile под ./api_build:

FROM alpine:3.8

FROM ruby:2.3-alpine as rb

RUN apk update && apk upgrade && \
      echo @edge http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
      echo @edge http://nl.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories

RUN apk add --no-cache \
      alpine-sdk \
      tzdata \
      libxml2-dev \
      libxslt-dev \
      libpq \
      postgresql-dev \
      elixir \
      erlang

ОБНОВЛЕНИЕ: я только что понял, что docker-compose build просто создает части композиции, если это необходимо (например, файл Docker обновлен), значит ли это, что нет способа создать образ с помощью компоновки докеров? Или я делаю что-то очень неправильно?


person Ivan Yurov    schedule 24.07.2018    source источник


Ответы (1)


Поскольку ответов нет, попробую ответить сам. Я не уверен, что это будет полезно, но я обнаружил, что у меня были некоторые неправильные представления о Docker, которые мешали мне увидеть решение или его отсутствие.

1) Чего я не понял, так это того, что docker-compose используется для оркестрации композиций контейнеров, его нельзя встроить в единый образ, содержащий все необходимые вам сервисы.

2) Многоэтапные сборки звучали захватывающе и немного волшебно, пока я не понял, что каждый следующий этап запускает изображение с нуля. Единственное, что вы можете сделать, это скопировать некоторые файлы с предыдущих этапов (если они имеют псевдоним AS). Это все еще круто, но копирование вручную установки с сотнями файлов может (и станет) превратиться в кошмар.

3) Docker предназначен для запуска только одного процесса внутри контейнера, но это не означает, что он не может запускать несколько процессов. Таким образом, решение моей проблемы заключалось в использовании супервайзера. В частности, S6, который, как говорят, легкий, а это именно то, что мне нужно для крошечных изображений Alpine.

В итоге я развернул s6-overlay из just-containers:

RUN curl -L -s https://github.com/just-containers/s6-overlay/releases/download/v1.21.4.0/s6-overlay-amd64.tar.gz \
      | tar xvzf - -C /

ENTRYPOINT [ "/init" ]

Он предоставляет каталог /etc/services.d, куда помещаются служебные скрипты. Например, для postgresql минимальный пример будет (в /etc/services.d/postgres/run):

#!/usr/bin/execlineb -P
s6-setuidgid postgres
postgres -D /usr/local/pgsql/data

Вот и все.

person Ivan Yurov    schedule 27.07.2018
comment
Спасибо за ответ на свой вопрос - это помогло мне избежать еще одной кроличьей норы - person Jack Collins; 15.01.2019
comment
Как ни странно, это то, что я делаю в большинстве случаев при переполнении стека — задаю вопрос, а затем отвечаю на него сам, потому что нет ответов. Но да, я рад, что это было полезно! - person Ivan Yurov; 15.01.2019