docker - mkdir 命令与 dockerfile 的操作
问题描述
我无法在带有 dockerfile 的容器中使用 mkdir 命令创建目录。
我的 Dockerfile 文件很简单;
FROM php:fpm
WORKDIR /var/www/html
VOLUME ./code:/var/www/html
RUN mkdir -p /var/www/html/foo
这样我就创建了一个简单的 php:fpm 容器。我写信创建一个名为 foo 的目录。
docker build -t phpx .
我已经用上面的代码构建了。
在我的 docker-compose 文件中如下。
version: '3'
services:
web:
container_name: phpx
build : .
ports:
- "80:80"
volumes:
- ./code:/var/www/html
之后; 运行以下代码,我进入了容器内核。
docker exec -it phpx /bin/bash
但是/var/www/html中没有一个叫foo的目录。
我想知道我在哪里做错了。你能帮助我吗?
解决方案
原因是您正在将一个卷从您的主机安装到/var/www/html
. 一步步:
RUN mkdir -p /var/www/html/foo
在容器的文件系统中创建 foo 目录。- docker-compose.yml将容器文件系统中的
./code:/var/www/html
内容“隐藏”在主机文件系统的内容后面。/var/www/html
./code
所以实际上,当你执行到你的容器中时,你会看到./code
主机上目录的内容/var/www/html
。
修复:要么从 docker-compose.yml 中删除卷,要么foo
在启动容器之前在主机上创建 -directory。
附加说明:在您的 Dockerfile 中,您将卷声明为VOLUME ./code:/var/www/html
. 这不起作用,您可能应该将其删除。在 Dockerfile 中,您不能在主机上指定路径。
引用docker:
主机目录在容器运行时声明:主机目录(挂载点)本质上是依赖于主机的。这是为了保持图像的可移植性。因为不能保证给定的主机目录在所有主机上都可用。因此,您无法从 Dockerfile 中挂载主机目录。VOLUME 指令不支持指定主机目录参数。您必须在创建或运行容器时指定挂载点。
推荐阅读
- c - 如何检查传递给任何函数的变量参数的数量?
- python - 多标签分类 - ValueError:logits 和标签必须具有相同的形状 ((None, 5) vs (None, 20))
- apache-spark - 编组不适用于 MarkLogic 中的 JAXBHandle
- javascript - PokeAPI 问题,无法获取数据
- html - 如何防止 div 在缩放时重新调整大小?
- excel - 如何使用递归代码提高性能
- xamarin - 如何在 Android 自定义渲染器中设置字体样式
- macos - 库版本不兼容 - cdo 版本需要 11.0.0 或更高版本,但 libcurl.4.dylib 提供 7.0.0 版本
- r - 如何在ggplot中将字符用作多线图的x轴?
- php - 保持按钮禁用,直到当前页面重新加载(使用 Jquery)