Docker build-arg and copy

68

尝试复制文件夹的内容,当我像这样硬编码路径时它可以工作:

COPY ./my-folder /path/to/location

但需要能够更改此路径,因此我尝试使用构建参数,例如:

COPY ${folderVariable} /path/to/location

然后使用构建

--build-arg folderVariable=./my-folder

但它会复制“my-folder”所在文件夹中的所有内容,而我只想要“my-folder”的内容。

2个回答

67

对于 COPY --from=$var ... 的情况,扩展仍然不起作用。但您可以创建中间图像作为别名,就像这样:

ARG docsBranch=4.5
ARG docsFullPath=registry.myCompany.pro/group/project-docs/docs:$docsBranch

# Lifehack
FROM $docsFullPath as docs

FROM node:10.21.0-buster-slim
WORKDIR /app

# Now we can use docs instead of $docsFullPath
COPY --from=docs /app/html/en ./documentation/en

1
你甚至可以提供完整的映像名称而非仅版本号。例如,以下示例也可行:
ARG docsImageName=registry.myCompany.pro/group/project-docs/docs:0.1
ARG docsFullPath=$docsImageName
- Neeraj Gulia
8
2022 年仍然存在问题。这应该是正确答案。 - Daniel Mikusa

67

在使用之前,您需要在 Dockerfile 中使用 ARG 定义它:

FROM alpine:3.3

ARG folderVariable=./my-folder # Optional default value to be `./my-folder`

COPY ${folderVariable} /opt/my-folder

并像这样构建:

docker build --build-arg folderVariable=./folder-copy -t test .

更多详情请参见:https://docs.docker.com/engine/reference/builder/#arg


31
可能过去这样做是可行的,但在当前的 Docker 版本(19.03.4)中,构建参数似乎没有按预期扩展。 - Emil
7
@Emil,你有多阶段构建吗?ARG的作用域是构建阶段。 - Aankhen
4
在单阶段构建中(在19.03.5或18版本中),COPY语句的--from参数似乎无法扩展。 - Jason Young
20
注意,ARG有作用域(https://docs.docker.com/engine/reference/builder/#scope)。我已经为此苦战了数小时:P - Manolo
5
天啊@Manolo,要是我4个小时前就看到你的评论就好了...在我看来,作用域的东西并不是很直观。 - Søren Eriksen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接