gpt4 book ai didi

Docker 多阶段构建和 Codeship 运行容器

转载 作者:IT王子 更新时间:2023-10-29 02:20:49 31 4
gpt4 key购买 nike

我正在进行多阶段 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 多阶段构建的要点。

最佳答案

我能够按照本指南使用分为两个不同文件的多阶段构建来解决这个问题: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"]

然后,在您的 codeship-service.yml 文件中:

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

在您的 codeship-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,因为它会启动您的应用程序。我们使用第二阶段将较小的构建推送到镜像注册表。

关于Docker 多阶段构建和 Codeship 运行容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493851/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com