Docker中的WORKDIR在Windows上无法工作

123次阅读
没有评论

问题描述

在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文件路径。你可以使用绑定挂载将主机路径挂载到容器内部,或者将文件保存到容器内部的其他路径。请根据你的需求选择适合的方法。

正文完