我有一个包含Dockerfile
和docker-compose.yml
的项目。
Dockerfile:
FROM mhart/alpine-node:11 AS builder
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn build
WORKDIR /app
COPY --from=builder /app/build .
CMD ["serve", "-p", "80", "-s", "."]
docker compose.yml:
version: "3"
services:
front:
build: .
ports:
- 8080:80
restart: always
当我试着像下面这样运行时。
docker compose up-d
我收到以下消息:
Building front
Step 1/8 : FROM mhart/alpine-node:11 AS builder
---> 5ff13b69f215
Step 2/8 : WORKDIR /app
---> Using cache
---> 1da7c0d4dfac
Step 3/8 : COPY . .
---> Using cache
---> 8d82bb9c0ecf
Step 4/8 : RUN yarn install
---> Using cache
---> 1e557a2dbe03
Step 5/8 : RUN yarn build
---> Using cache
---> ea2d3f56ff39
Step 6/8 : WORKDIR /app
---> Using cache
---> 1edb82c45c49
Step 7/8 : COPY --from=builder /app/build .
ERROR: Service 'front' failed to build: invalid from flag value builder: pull access denied for builder, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
我在Stackoverflow上看到了另一个问题,我想这可能与我的问题很接近
从标志值生成无效:生成的拉取访问被拒绝,存储库不存在或可能需要';docker登录';
但我只有一个构建阶段,而不是像问题中那样的两个阶段。
您的docker构建失败,因为您缺少用于运行时环境的FROM
命令。这似乎是一个多阶段的docker构建,您正试图从名为builder
的前一个构建阶段复制文件,但您仍处于构建的第一个(也是唯一一个(阶段(称为构建器(。
你有两个选择。任何一种都应该有效。
- 在构建中引入第二个运行时阶段:
添加另一个FROM
命令,其中包含您想要作为运行时的映像。我刚刚在这里再次使用了mhart/alpine-node:11
,但您可能需要不同的运行时环境。
FROM mhart/alpine-node:11 AS builder
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn build
FROM mhart/alpine-node:11 AS runtime
RUN yarn global add serve
WORKDIR /app
COPY --from=builder /app/build .
CMD ["serve", "-p", "80", "-s", "."]
- 使其成为非多阶段构建:
只需删除COPY
命令并将您的工作目录更改为构建目录:
FROM mhart/alpine-node:11 AS builder
RUN yarn global add serve
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn build
WORKDIR /app/build
CMD ["serve", "-p", "80", "-s", "."]