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 创建映像?或者我做错了什么?
既然没有答案,我会尝试自己回答。我不确定它是否有用,但我发现我对 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)
差不多就是这样了。
| 归档时间: |
|
| 查看次数: |
1725 次 |
| 最近记录: |