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



我正在尝试创建一个自定义docker映像,以便将其用作AWS CodeBuild的构建映像。如果我只是在设置好的环境中对Dockerfile执行docker build,它会很好地工作。但现在我需要添加一个postgres实例来运行测试。所以我认为使用docker-compose就可以了。然而,我不知道如何让它发挥作用。当我尝试docker-compose up时,合成的静态部分(Dockerfile中的图像(似乎立即停止了,因为没有入口点。此时,我可以通过运行docker-compose run db psql -h db -U testdb -d testdb连接到数据库实例。但是,当我构建它并将其提供给AWS提供的脚本时,它运行良好,直到我的测试尝试到达DB服务器。这就是它超时失败的地方,就好像没有数据库实例一样。

配置如下:

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

./api_build:下的Dockerfile

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文件(,所以这是否意味着没有办法使用Docker compose创建图像?还是我做错了什么?

由于没有答案,我将尝试自己回答。我不确定它是否有用,但我发现我对Docker有一些误解,这使我无法看到解决方案或缺乏解决方案。

1( 我没有意识到docker-compose用于容器组合的编排,它不能构建到一个包含您需要的所有服务的单个映像中。

2( 多阶段构建听起来令人兴奋,有点神奇,直到我发现下一个阶段都是从头开始的。您唯一能做的就是从以前的阶段复制一些文件(如果使用AS别名(。它仍然很酷,但手动复制一个包含数百个文件的安装可能(而且将(成为一场噩梦。

3( Docker被设计为只有一个进程在容器内运行,但这并不意味着它不能运行多个进程。因此,我的问题的解决方案是使用一个主管。特别是S6,据说它很轻,这正是我在阿尔卑斯山拍摄微小图像时所需要的。

我最终从just-containers:部署了s6-overlay

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

差不多就是这样。

最新更新