ОТ ... КАК в Dockerfile не работает, как я ожидаю - PullRequest
1 голос
/ 18 июня 2019

Я только учусь использовать Docker, поэтому, пожалуйста, потерпите меня.

Я хочу создать образ докера, который будет построен поверх другого образа докера, который я уже построил.В моем dockerfile я ссылаюсь на конкретную версию базового образа, но для удобства обслуживания я хочу упомянуть эту версию только один раз в dockerfile.Документация по dockerfile, похоже, подсказывает мне, что я могу использовать ключевое слово «AS» для сопоставления символического имени с конкретным тегом версии.В параметре --from для следующей инструкции COPY я должен иметь возможность использовать символическое имя вместо конкретного изображения: тег версии.

Это мой файл docker:

FROM base:2.0 AS my_base

WORKDIR /child2

COPY --from=my_base /base /child2
COPY . /child2

CMD ["python", "-u", "child2.py"]

Когда я строю с использованием этого файла docker с

docker build -t child2 .

, я получаю следующую ошибку:

Step 1/5 : FROM base:2.0 AS my_base
 ---> c5e2be45da55
Step 2/5 : WORKDIR /child2
 ---> Using cache
 ---> 1b5a4ad816c9
Step 3/5 : COPY --from=my_base /base /child2
invalid from flag value my_base: pull access denied for my_base, repository does not exist or may require 'docker login'

Я использовал 'docker login', но я снова получил ту же ошибку.

Допускаю ли я какую-то ошибку в синтаксисе файла dockerfile, или мое предположение об использовании ключевого слова AS просто неверно?

Я использую Docker версии 18.09.2 для Windows 10.

1 Ответ

3 голосов
/ 18 июня 2019

FROM...AS предназначен для многоэтапных сборок :

В многоэтапных сборках вы используете несколько операторов FROM в вашем Dockerfile.Каждая инструкция FROM может использовать различную базу, и каждая из них начинает новый этап сборки.Вы можете выборочно копировать артефакты с одного этапа на другой, оставляя после себя все, что вам не нужно, в конечном изображении.Чтобы показать, как это работает, давайте адаптируем Dockerfile из предыдущего раздела для использования многоэтапных сборок.

Ваш dockerfile просто имеет один этап, бессмысленно использовать его, допустимый вариант использования следующий:

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"]  

Здесь построенный двоичный файл на первом этапе (builder) может быть скопирован на второй этап с новой базой (FROM alpine:latest).Преимущество: это может уменьшить настройку цепочки инструментов golang на втором этапе, просто используйте двоичный файл с первого этапа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...