The docker build CLI command sends the specified directory (typically . ) as the "build context" to the Docker Engine (daemon). Instead of specifying the build context as /worker-a , specify the build context as the root directory, and use the -f argument to specify the path to the Dockerfile in one of the child directories.
You'll have to rework your Dockerfiles slightly, to point them to ../config/config.json , but that is pretty trivial to fix. Also check out this question/answer, which I think addresses the exact same problem that you're experiencing. How to include files outside of Docker's build context? Hope this helps! Cheers
4条答案
按热度按时间mwyxok5s1#
坞站X1 E0 F1 X
以下是在容器中使用共享文件的一些不同方法:
构建时间
从配置映像复制(Docker构建工具包)
Docker的最新版本允许
RUN
步骤从命名映像或以前的构建阶段与--mount=type=bind,target=/dir,source=/dir,from=image-or-stage-name
绑定挂载为包含共享配置/文件的基本
me/worker-config
映像创建Dockerfile
。构建并标记配置映像
me/worker-config
在真实的构建期间挂载
me/worker-config
映像共享基本映像
为包含共享配置/文件的基本
me/worker-config
映像创建Dockerfile
。构建并标记映像
me/worker-config
为您的所有worker
Dockerfile
源化基本me/worker-config
映像生成脚本
使用脚本将通用配置推送到每个工作容器。
./build worker-n
个从URL生成
从所有
worker-n
组建的通用URL提取组态。增加映像构建上下文的范围
通过从包含共享文件和特定容器文件的父目录进行构建,在构建上下文中包含符号链接目标文件。
您在
Dockerfile
中引用的所有源路径也必须更改,以匹配新的构建上下文:变成了
如果您有一个大型建置内容,使用这个方法可以让 * 所有 * 建置内容都很大,因为它们都变成共用的。它会减慢建置,特别是远端Docker建置服务器的建置。请注意,只会指涉the base of the build context中的
.dockerignore
档案。可以装载卷的备用内部版本
其他致力于Dockerfile兼容性的项目可能在构建时支持卷。例如,
podman build
/buildah支持--volume
选项,以将挂载文件从主机绑定到构建容器。然后,构建版本可以引用已装载的卷
运行时间
从命名卷装入config目录
像这样的卷只能作为目录使用,因此您不能像将文件从主机装载到容器时那样指定文件。
从数据容器装入config目录
同样,目录只是因为它基本上是相同的上面。这将自动复制文件从目标目录到新创建的共享卷虽然。
在运行时从主机装载配置文件
mrfwxfqh2#
Node.js特定的解决方案
我也遇到了这个问题,我想分享另一个上面没有提到的方法,我在
Dockerfile
中没有使用npm link
,而是使用了yalc。1.在容器中安装
yalc
,例如RUN npm i -g yalc
。1.在Docker中构建你的库,然后运行
yalc publish
(如果你的共享库是私有的,添加--private
标志)。这将在本地“发布”你的库。1.在运行
npm install
之前,在每个通常使用npm link
的存储库中运行yalc add my-lib
。它将在您的Docker容器中创建一个本地.yalc
文件夹,在node_modules
中创建一个指向此文件夹的符号链接,并重写您的package.json
以引用此文件夹,这样您就可以安全地运行install。1.或者,如果执行两阶段构建,请确保还将
.yalc
文件夹复制到最终映像。下面是一个
Dockerfile
示例,假设您有一个包含三个软件包的mono仓库:models、gui和server,并且models存储库必须是共享的,并且命名为my-models
。希望能帮上忙...
yhuiod9q3#
The
docker build
CLI command sends the specified directory (typically.
) as the "build context" to the Docker Engine (daemon). Instead of specifying the build context as/worker-a
, specify the build context as the root directory, and use the-f
argument to specify the path to theDockerfile
in one of the child directories.You'll have to rework your Dockerfiles slightly, to point them to
../config/config.json
, but that is pretty trivial to fix.Also check out this question/answer, which I think addresses the exact same problem that you're experiencing.
How to include files outside of Docker's build context?
Hope this helps! Cheers
oxiaedzo4#
另一种解决方案是将所有的软链接升级为硬链接。