使用 dockerfile 操作 mkdir 命令



我无法在带有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 .

我用上面的代码构建了。

在我的码头工人撰写文件中,如下所示。

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。 循序渐进:

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

所以实际上,当您执行容器时,当您查看/var/www/html时,您会看到主机上./code目录的内容。

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

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

引用码头工人的话:

主机目录

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

我能够在 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

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

所以我的建议是:从"Dockerfile"中删除 "Dockerfile"中的卷参数,正如 Fabian Braun 正确指出的那样。

FROM php:fpm
RUN mkdir -p /var/www/html/foo
WORKDIR /var/www/html

并从 docker 撰写文件中删除卷参数。它会起作用。此外,我想知道您如何测试一个名为"foo"的目录。 Docker-compose 文件内容

version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile # The name of your docker file
container_name: phpx
ports:
- "80:80"

我已经在M1 Macbook上构建了这个。 这个对我有用。

docker build -t emr6.10_custom .
FROM 755674844232.dkr.ecr.us-east-1.amazonaws.com/spark/emr-6.10.0:latest 
USER root
RUN yum update -y && 
yum install -y java-11-amazon-corretto && 
yum clean all;
ENV JAVA_HOME /usr/lib/jvm/java-11-amazon-corretto.aarch64
RUN update-alternatives --set java $JAVA_HOME/bin/java
USER hadoop:hadoop

构建镜像后,我们应该检查 java 目录路径。 因为它因您的系统而异。

docker run --rm -ti emr6.10_custom:latest /bin/bash

然后,您可以正确修复码头工人。

您可以使用 Dockerfile 的 SHELL 指令。

ENV HOME /usr/local
SHELL ["/bin/sh", "-c"]
RUN mkdir  $HOME/logs

最新更新