Чего вы пытаетесь достичь с помощью многоступенчатой docker сборки здесь? Если ваш второй этап начинается с результата первого этапа в сборке с двумя этапами, вы также можете иметь только один этап ...
Обычно используются многоэтапные сборки, потому что один использует первый этап (например, " builder ") для создания какого-либо артефакта, который требует много инструментов разработки. На втором этапе только этот артефакт будет скопирован в небольшое базовое изображение, чтобы получить конечное изображение, которое очень мало, поскольку не содержит инструментов, необходимых для создания артефакта.
Пример из docker docs :
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
В вашем случае я почти уверен, что ваше окончательное изображение содержит пользователя jenkins, потому что ваш второй этап начинается с базового этапа. Однако эти команды копирования, которые копируют из базового образа, будут сбрасывать разрешения на root
на вашем втором этапе:
COPY --from=base /opt/app/jenkins/jenkins_tools /opt/app/jenkins/jenkins_tools
COPY --from=base /etc/default/docker /etc/default/docker
COPY --from=base /usr/bin/phantomjs /usr/bin/phantomjs
Эти команды копирования избыточны, так как вы все равно запускаете FROM base
. Если вы удалите эти строки, каталог jenkins_tools будет правильно принадлежать пользователю jenkins.
Обратите внимание, что вы можете изменить пользователя, который используется для выполнения команд во время сборки docker, с помощью USER <username>