我无法在带有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
。 循序渐进:
RUN mkdir -p /var/www/html/foo
在容器的文件系统中创建 foo 目录。- 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