使用 docker-compose 为 AWS CodeBuild 创建自定义构建映像

Iva*_*rov 1 docker docker-compose aws-codebuild

我正在尝试创建自定义 docker 映像,以便将其用作 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
Run Code Online (Sandbox Code Playgroud)

和 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
Run Code Online (Sandbox Code Playgroud)

更新:我刚刚意识到,docker-compose build如果需要的话,只需构建组合的一部分(例如更新 Docker 文件),那么这是否意味着无法使用 docker compose 创建映像?或者我做错了什么?

Iva*_*rov 5

既然没有答案,我会尝试自己回答。我不确定它是否有用,但我发现我对 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" ]
Run Code Online (Sandbox Code Playgroud)

它提供/etc/services.d服务脚本所在的目录。例如,对于 postgresql,最小的示例是(在 /etc/services.d/postgres/run 中):

#!/usr/bin/execlineb -P
s6-setuidgid postgres
postgres -D /usr/local/pgsql/data
Run Code Online (Sandbox Code Playgroud)

差不多就是这样了。