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. 一步步:
RUN mkdir -p /var/www/html/foo 在容器的文件系统中创建 foo 目录。./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)
| 归档时间: |
|
| 查看次数: |
53636 次 |
| 最近记录: |