Многоэтапные сборки Docker и контейнер Codeship. - PullRequest
0 голосов
/ 23 мая 2018

Я делаю многоэтапную сборку Docker:

# Dockerfile

########## Build stage ##########
FROM golang:1.10 as build

ENV TEMP /go/src/github.com/my-id/my-go-project
WORKDIR $TEMP
COPY . .
RUN make build

########## Final stage ##########
FROM alpine:3.4

# ...
ENV HOME /home/$USER
ENV TEMP /go/src/github.com/my-id/my-go-project

COPY --from=build $TEMP/bin/my-daemon $HOME/bin/
RUN chown -R $USER:$GROUP $HOME

USER $USER
ENTRYPOINT ["my-daemon"]

, а Makefile содержит частично:

build: bin
        go build -v -o bin/my-daemon cmd/my-daemon/main.go

bin:
        mkdir $@

Все это прекрасно работает с docker build.


Теперь я хочу использовать Codeship , поэтому у меня есть:

# codeship-services.yml
cachemanager:
  build:
    image: my-daemon
    dockerfile: Dockerfile

и:

# codeship-steps.yml
- name: my-daemon build
  tag: master
  service: my-service
  command: true

Проблемаесли я делаю jet steps --master, он все строит нормально, но тогда запускает контейнер, как будто я сделал docker run.Зачем?Я не хочу, чтобы это делалось.

Это как если бы мне пришлось иметь два отдельных Dockerfile с: один только для этапа сборки и один только для этапа выполнения и используйте первый с jet.Но тогда это побеждает точку многоступенчатых сборок Docker.

1 Ответ

0 голосов
/ 21 августа 2019

Мне удалось решить эту проблему, используя многоэтапные сборки, разделенные на два разных файла, следуя этому руководству: https://documentation.codeship.com/pro/common-issues/caching-multi-stage-dockerfile/

По сути, вы возьмете свой существующий Dockerfile и разделите его на два файла следующим образом.со второй ссылкой на первую:

# Dockerfile.build-stage
FROM golang:1.10 as build-stage

ENV TEMP /go/src/github.com/my-id/my-go-project
WORKDIR $TEMP
COPY . .
RUN make build
# Dockerfile
FROM build-stage as build-stage

FROM alpine:3.4

# ...
ENV HOME /home/$USER
ENV TEMP /go/src/github.com/my-id/my-go-project

COPY --from=build $TEMP/bin/my-daemon $HOME/bin/
RUN chown -R $USER:$GROUP $HOME

USER $USER
ENTRYPOINT ["my-daemon"]

Затем в вашем файле codehip-service.yml:

# codeship-services.yml
cachemanager-build:
  build:
    dockerfile: Dockerfile.build-stage
cachemanager-app:
  build:
    image: my-daemon
    dockerfile: Dockerfile

И в вашем файле codehip-steps.yml:

# codeship-steps.yml
- name: cachemanager build
  tag: master
  service: cachemanager-build
  command: <here you can run tests or linting>
- name: publish to registry
  tag: master
  service: cachemanager-app
  ...

Не думаю, что вы действительно хотите запустить Dockerfile, потому что он запустит ваше приложение.Мы используем второй этап, чтобы отправить небольшую сборку в реестр изображений.

...