使用 dockerfile 操作 mkdir 命令

Spa*_*roy 20 docker dockerfile docker-compose

我无法在带有 dockerfile 的容器中使用 mkdir 命令创建目录。

我的 Dockerfile 文件很简单;

FROM php:fpm

WORKDIR /var/www/html

VOLUME ./code:/var/www/html

RUN mkdir -p /var/www/html/foo
Run Code Online (Sandbox Code Playgroud)

通过这种方式我创建了一个简单的 php: fpm 容器。我写信创建一个名为 foo 的目录。

docker build -t phpx .
Run Code Online (Sandbox Code Playgroud)

我已经用上面的代码构建了。

在我的 docker-compose 文件中,如下所示。

version: '3'

services:
web:
container_name: phpx
build : .
ports:
- "80:80"
volumes:
- ./code:/var/www/html
Run Code Online (Sandbox Code Playgroud)

之后; 运行以下代码,我进入了容器内核。

docker exec -it phpx /bin/bash
Run Code Online (Sandbox Code Playgroud)

但是/var/www/html中没有一个叫foo的目录。

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

fab*_*ica 30

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

  1. RUN mkdir -p /var/www/html/foo 在容器的文件系统中创建 foo 目录。
  2. docker-compose.yml将容器文件系统中的内容./code:/var/www/html“隐藏”在主机文件系统/var/www/html的内容后面./code

所以实际上,当你 exec 进入你的容器./code时,当你查看/var/www/html.

修复:要么从 docker-compose.yml 中删除卷,要么foo在启动容器之前在主机上创建-directory。

附加说明:在您的 Dockerfile 中,您将卷声明为VOLUME ./code:/var/www/html. 这不起作用,您可能应该将其删除。在 Dockerfile 中,您不能在主机上指定路径。

引用docker

主机目录在容器运行时声明:主机目录(挂载点)本质上是依赖于主机的。这是为了保持图像的可移植性。因为不能保证给定的主机目录在所有主机上都可用。因此,您无法从 Dockerfile 中挂载主机目录。VOLUME 指令不支持指定主机目录参数。您必须在创建或运行容器时指定挂载点。


小智 11

我可以在 docker 的“workdir”内创建一个目录,如下所示:

Dockerfile 内容

COPY src/ /app
COPY logging.conf /app
COPY start.sh   /app/
COPY Pipfile /app/
COPY Pipfile.lock /app/
COPY .env /app/
RUN mkdir -p /app/logs
COPY logs/some_log.log /app/logs/

WORKDIR /app
Run Code Online (Sandbox Code Playgroud)

我没有在“docker-compose.yaml”文件中提到卷参数

所以这是我的建议:从Fabian Braun正确指出的“Dockerfile”中删除卷参数。

FROM php:fpm
RUN mkdir -p /var/www/html/foo
WORKDIR /var/www/html
Run Code Online (Sandbox Code Playgroud)

并从 docker-compose 文件中删除volume参数。它会起作用的。另外,我想知道你是如何测试有一个名为“foo”的目录的。Docker-compose文件内容

version: '3'
services:
  web:
  build:
    context: .
    dockerfile: Dockerfile # The name of your docker file
  container_name: phpx
  ports:
    - "80:80"
Run Code Online (Sandbox Code Playgroud)