问题描述
在Windows机器上使用Docker时遇到了一个问题。他有一个main.py
文件和一个Dockerfile
文件。main.py
文件会下载并保存一些.txt
文件,所以对于他来说,指定工作目录非常重要。然而,当他在Windows机器上运行Docker时,工作目录似乎无法正确设置。
以下是用户提供的main.py
文件和Dockerfile
文件的内容:
import pandas as pd
import csv
import requests
import time
import os
print(os.getcwd())
FROM ubuntu:16.04
USER ContainerUser
WORKDIR "C:\\Users\\.....\\Docker_Tutorial"
FROM python:3.8
ADD main.py .
RUN pip install requests pandas
CMD ["python", "./main.py"]
用户在终端中运行了以下命令:
docker build -t python-downloaddata .
docker run -it python-downloaddata
然而,输出结果应该是C:\Users\.....\Docker_Tutorial
,但实际上是/
。
用户不知道如何解决这个问题,他尝试过寻找解决方案,但没有找到有效的方法。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Windows上,Docker中的WORKDIR
指令无法直接使用Windows文件路径。WORKDIR
只能引用容器内部的目录路径。如果你想将文件保存到主机路径上,你需要使用绑定挂载(bind mount)的方式将主机路径挂载到容器内部。
以下是在Docker中使用绑定挂载的步骤:
1. 在docker run
命令中使用-v
参数来指定绑定挂载的路径。格式为host_path:container_path
,其中host_path
是主机上的路径,container_path
是容器内部的路径。
2. 将WORKDIR
指令修改为容器内部的路径。
下面是一个示例:
FROM ubuntu:16.04
USER ContainerUser
WORKDIR /app
FROM python:3.8
ADD main.py .
RUN pip install requests pandas
CMD ["python", "./main.py"]
在上面的示例中,我们将WORKDIR
指令修改为/app
,这是容器内部的路径。然后,在运行容器时,使用-v
参数将主机上的路径绑定到容器内部的/app
路径:
docker run -v C:\Users\.....\Docker_Tutorial:/app -it python-downloaddata
这样,main.py
文件中的os.getcwd()
输出将是C:\Users\.....\Docker_Tutorial
。
请注意,绑定挂载的路径应该是主机上的有效路径,并且容器用户有足够的权限访问该路径。
方案2
如果你不想使用绑定挂载,你可以考虑将文件保存到容器内部的其他路径,而不是WORKDIR
指定的路径。你可以在main.py
中使用绝对路径来保存文件,或者在Dockerfile
中使用COPY
指令将文件复制到容器内部的其他路径。
以下是一个示例:
FROM ubuntu:16.04
USER ContainerUser
WORKDIR /app
FROM python:3.8
ADD main.py .
COPY . /data
RUN pip install requests pandas
CMD ["python", "./main.py"]
在上面的示例中,我们将文件复制到了容器内部的/data
路径。你可以根据需要修改main.py
中保存文件的路径。
请注意,如果你选择这种方法,你需要确保容器内部的路径是有效的,并且容器用户有足够的权限访问该路径。
总结
在Windows上,Docker中的WORKDIR
指令无法直接使用Windows文件路径。你可以使用绑定挂载将主机路径挂载到容器内部,或者将文件保存到容器内部的其他路径。请根据你的需求选择适合的方法。