如果我切换npm到pnpm.
我应该如何修改该 Dockerfile 以使其保持多阶段,但也使用pnpm而不是npm?
我正在寻找一种使用python和Dockerfile创建多级构建的方法
即我正在尝试做的是使用几个图像创建一个Dockerfile:
第1张图片:安装所有编译时要求,并安装所有需要的python模块
第二个图像:将所有编译/构建的包从第一个图像复制到第二个图像,没有编译器本身(gcc,postgers-dev,python-dev等...)
最终的objcetive是一个较小的图像,运行python
所以问题是 - 如何'包装'在第一张图像中创建的所有已编译模块(site-packages/external libs),并以"干净"的方式将它们复制到第二张图像
新的docker功能是在dockerfile中执行类似的操作
FROM php7-fpm as build
...
FROM build AS test
...
FROM test AS staging
...
Run Code Online (Sandbox Code Playgroud)
据我所知,最后一个FROM语句标记了最终的输出图像.如何从一个中间图像中获得两个最终图像?
喜欢
...
FROM build AS test
...
FROM test AS staging
...
FROM test AS prod
Run Code Online (Sandbox Code Playgroud)
不应丢弃测试,分期和产品.我想将它们签入存储库.
我正在尝试为项目设置构建过程,但在 COPY 命令中使用 arg 时遇到了问题。
该过程的一部分是将库构建到图像中,供多个其他图像使用。问题出现在以下几行中:
ARG BUILD_CONFIG=dev
COPY --from=company/mu_library:${BUILD_CONFIG} /some/path /other/path
Run Code Online (Sandbox Code Playgroud)
根据错误消息,${BUILD_CONFIG}从未被翻译成dev. 预先添加回显行时,回显会打印dev。
ARG BUILD_CONFIG=dev
RUN echo ${BUILD_CONFIG}
COPY --from=company/mu_library:${BUILD_CONFIG} /some/path /other/path
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决它而不在 dockerfile 中创建所有都指向单独标签的重复阶段?
编辑:最小 Dockerfile
FROM node:12.15:0 as prod
ARG BUILD_CONFIG=dev
RUN echo ${BUILD_CONFIG}
COPY --from=test/test-library:${BUILD_CONFIG} /work/dist /work/library/dist
CMD[ "bash" ]
Run Code Online (Sandbox Code Playgroud)
错误:
invalid from flag value test/test-library:${BUILD_CONFIG}: invalid reference format
我想创建一个多阶段构建过程,而每个 docker 文件都嵌套在它们自己的本地目录中,并为每个 Docker 文件添加了相应的依赖项。有没有办法从本地的不同目录导入 Docker 文件,而我可以使用 Docker 的FROM命令导入它,以在构建中创建多个阶段?
如果没有,我是否可以ADD将其他暂存的 Docker 文件放入当前的 Docker 文件中,然后FROM在 docker 容器中使用,在添加和使用后将其删除FROM?
也许我正在考虑以错误的方式构建多阶段。
或者我可以简单地运行FROM {path/to/docker/locally}?这对我不起作用。
我正在为darshan utils写一个多阶段的Dockerfile :
ARG DARSHAN_VER=3.1.6
FROM fedora:29 as build
RUN dnf install -y \
gcc \
make \
bzip2 bzip2-devel zlib zlib-devel
RUN curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz" \
&& tar ...
FROM fedora:29
COPY --from=build "/usr/local/darshan-${DARSHAN_VER}" "/usr/local/darshan-${DARSHAN_VER}"
...
Run Code Online (Sandbox Code Playgroud)
我建立它,docker build -t darshan-util:3.6.1 .我得到的错误是:
Step 5/10 : RUN curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz" && tar ...
---> Running in 9943cce1669c
% Total % Received % Xferd Average Speed Time Time Time Current
...
curl: (78) RETR response: 550
The command …Run Code Online (Sandbox Code Playgroud) 我是 Docker 的初学者,我正在尝试分两个阶段构建映像,如下所述:https : //docs.docker.com/develop/develop-images/multistage-build/
您可以有选择地将工件从一个阶段复制到另一个阶段
查看那里给出的示例,我认为可以在第一阶段构建一些文件,然后将它们提供给下一个阶段:
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"]
Run Code Online (Sandbox Code Playgroud)
(示例取自上述链接页面)
那不是应该做的COPY app.go .和COPY --from=builder /go/src/github.com/alexellis/href-counter/app .应该做的吗?
我可能对正在发生的事情有一个完全的误解,因为当我尝试做类似的事情时(见下文),似乎COPY第一阶段的命令无法看到刚刚构建的文件(我可以确认它们实际上是使用一个RUN ls步骤构建的,但是我得到了一个lstat <the file>: no such file or directory错误)。
事实上,我可以收集到的大多数其他信息COPY(除了上面链接中的示例),而是表明这COPY实际上是为了从 …
我正在尝试构建一个具有以下阶段的多阶段 dockerfile,但所有阶段都在执行。
即使我EXECUTION_ENV=local在 docker 构建中指定了,我总是认为 git clone 正在执行
Dockerfile:
ARG GIT_TOKEN=abc:1a2b3
ARG EXECUTION_ENV=local
# get dependencies from github
FROM alpine/git as gitclone-ci
WORKDIR /usr/src/
RUN git clone https://{GIT_USER_TOKEN}@github.com/something.git \
&& git clone https://{GIT_USER_TOKEN}@github.com/somethingelse.git
## in local dependencies are already available in the parent folder
FROM alpine/git as gitclone-local
WORKDIR /usr/src/
COPY ../something /usr/src/something
COPY ../somethingelse /usr/src/somethingelse
FROM node:latest as builder
WORKDIR /usr/src
COPY --from=gitclone-${EXECUTION_ENV} /usr/src .
COPY package* ./
COPY src/ src/
RUN ["npm", "install"]
Run Code Online (Sandbox Code Playgroud)
Docker 构建命令尝试:
docker …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个目标的 Dockerfile。例如:
FROM x as frontend
...
FROM y as backend
...
FROM z as runtime
...
COPY --from=frontend ...
COPY --from=backend ...
Run Code Online (Sandbox Code Playgroud)
为了构建和标记最终图像,我使用:
docker build -t my-project .
Run Code Online (Sandbox Code Playgroud)
为了构建和标记中间目标,我提供了--target参数:
docker build -t my-project-backend --target backend .
Run Code Online (Sandbox Code Playgroud)
但是是否有可能构建一个最终图像并标记所有中间图像?换句话说,等同于:
docker build -t my-project-frontend --target frontend .
docker build -t my-project-backend --target backend .
docker build -t my-project .
Run Code Online (Sandbox Code Playgroud)
但是用一个命令?
我认为需要一些解释。如果使用 buildkit( export DOCKER_BUILDKIT=1),那么所有独立的目标都是并行构建的。所以它比一个一个地构建它们要快。我需要标记每个目标以将它们推送到 docker 注册表以及最后一个。
目前我正在 CI 中构建我的图像而没有 buildkit,我正在尝试加快这个过程。
在阅读了多阶段 docker 构建可能实现的巨大图像大小减小之后,我尝试缩小用于构建 Go 二进制文件的 Dockerfile 的图像大小。我的 Dockerfile 如下。
# Configure environment and build settings.
FROM golang:alpine AS buildstage
ARG name=ddmnh
ENV GOPATH=/gopath
# Create the working directory.
WORKDIR ${GOPATH}
# Copy the repository into the image.
ADD . ${GOPATH}
# Move to GOPATH, install dependencies and build the binary.
RUN cd ${GOPATH} && go get ${name}
RUN CGO_ENABLED=0 GOOS=linux go build ${name}
# Multi-stage build, we just use plain alpine for the final image.
FROM alpine:latest
# Copy the …Run Code Online (Sandbox Code Playgroud)