当我从VS Code启动容器时,它会获得自己的工作区文件夹,例如。/workspaces/d2
。我可以在Dockerfile
的RUN命令中引用工作区路径吗?我将有一些需要在子目录中完成的构建步骤。
我尝试设置一个环境变量PROJECT
,这部分工作。
我的简单示例文件是:devcontainer.json:
{
"name": "test",
"context": "..",
"dockerFile": "./Dockerfile",
"build": {
"args": {
"PROJECT": "${containerWorkspaceFolder}"
}
}
}
Dockerfile:
FROM --platform=linux/amd64 ubuntu:22.04
# LABEL org.opencontainers.image.authors="steve@espops.com"
# Pass in the current project workspace directory, which VS Code establishes
ARG PROJECT
RUN apt-get update && apt-get install -y git
RUN echo ${PROJECT} >out.txt
pwd
/workspaces/d2
cat /out.txt
/workspaces/d2
但是,当我在该文件夹中添加构建指令时,我收到错误消息,说它不存在。
这可以通过以下方式看到:
ENV PROJECT=${PROJECT}
RUN echo $PROJECT >out.txt
RUN bash -c ls -l $PROJECT >>out.txt
文件out.txt显示了预期的变量值,但ls
显示的是/
的内容,而不是项目文件夹,在所有初始化完成后,项目文件夹在交互式shell中正确显示。Dockerfile
可以等待VS Code创建这些文件夹吗?或者它总是必须在VS Code创建它们之前完成?
1条答案
按热度按时间nlejzf6q1#
简短回答:no.
Dockerfile
必须完成,然后VS Code初始化其扩展等。然而,我发现了一种使用VSCode
postCreateCommand
的方法(见这里)也提到了here。在
devcontainer.json
中,添加:使用
+x
权限在项目的主文件夹中创建脚本,例如post_create.sh:
在容器重建时,在其他步骤完成后,脚本将在终端窗口中运行。
不管.sh文件的开头是否有任何shebang,看起来总是会得到
sh
shell,因此您可能希望在postCreateCommand
属性的开头调用bash
。