[英]Creating custom build image for AWS CodeBuild with docker-compose
我正在嘗試創建一個自定義Docker映像,以將其用作AWS CodeBuild的構建映像。 如果我只是使用設置環境對Dockerfile進行docker docker build
,則效果很好。 但是現在我需要添加一個postgres實例來運行測試。 所以我認為使用docker-compose
可以解決問題。 但是,我沒有弄清楚如何使其工作。 當我嘗試docker docker-compose up
,似乎組成的靜態部分(來自Dockerfile的圖像)立即停止,因為沒有入口點。 此時,我可以通過運行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
和./api_build下的./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文件),這是否意味着沒有辦法使用docker compose創建映像? 還是我做錯了什么?
由於沒有答案,因此我將嘗試自己回答。 我不確定它是否會有用,但是我發現我對Docker有一些誤解,這使我看不到解決方案或缺乏解決方案。
1)我沒有意識到的是docker-compose
用於編排容器組合,它無法構建到包含所需所有服務的單個映像中。
2)多階段構建聽起來令人興奮並且有些神奇,直到我發現每個下一階段都從頭開始創建圖像。 您唯一可以做的就是復制以前階段的某些文件(如果使用AS
別名)。 它仍然很酷,但是手動復制包含數百個文件的安裝可能(並且將會)成為噩夢。
3)Docker被設計為僅在容器內部運行一個進程,但這並不意味着它不能運行多個進程。 因此,解決我的問題的方法是使用主管。 特別是S6,據說重量很輕,這正是我使用微型Alpine圖像所需要的。
我最終從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
就是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.