首页 > 解决方案 > 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的目录。

我想知道我在哪里做错了。你能帮助我吗?

标签: dockerdocker-composedockerfile

解决方案


原因是您正在将一个卷从您的主机安装到/var/www/html. 一步步:

  1. RUN mkdir -p /var/www/html/foo在容器的文件系统中创建 foo 目录。
  2. 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 指令不支持指定主机目录参数。您必须在创建或运行容器时指定挂载点。


推荐阅读