我如何构建一个 docker 图像并将其父文件夹作为 workdir?
How can I build a docker image with it parent folder as workdir?
这可能是一个愚蠢的问题,但我是 Docker 的新手,我正在努力解决这个问题。我有一个包含许多子文件夹的项目,如下例所示:
project-folder:
folder_1:
code1.py
Dockerfile
requirements.txt
folder_2:
code2.py
Dockerfile
requirements.txt
folder_data:
file1
file2
file3
那么,我想这样做:
- 为所有容器在
project-folder
中维护我的工作目录;
- 在每个容器内,我应该能够访问
folder_data
- 我知道我必须指定一个卷,我只是不知道如何在不保留我的 project-folder
的情况下执行此操作作为工作目录;
- 我需要将我的工作目录 (
project-folder
) 传递给我的 code1.py
注意:
只有当我在每个子文件夹中创建图像时,我的图像才成功创建,就像这样 Dockerfile:
FROM python:3.6-slim
COPY . /folder_1
WORKDIR /folder_1
RUN pip install -r requirements.txt
CMD ["python3", "code1.py", "$(pwd)"]
图像创建命令:
docker build -t image_folder1 .
我目前正在 folder_1
的上下文中创建图像,因为我无法在 project-folder
的上下文中正确创建图像
docker build
命令末尾的.
参数是上下文目录;您 COPY
放入图像中的任何内容都必须在此子树中。如果您需要在图像中包含其直接子树之外的内容,则需要使用祖先目录作为构建上下文,但您可以使用 docker build -f
选项在子目录中命名文件。
cd project-folder
docker build -t image_folder1 -f folder_1/Dockerfile .
在 Docker 文件中,由于您是从父目录开始的,因此您需要包含 COPY
中任何文件的相对路径;但是,现在允许包含以前的同级目录。
FROM python:3.6-slim
WORKDIR /app
# Good practice to copy just dependencies first; this helps
# layer caching when you repeat `docker build`.
# COPY source path is relative to the `docker build` directory,
# which we've set up to be the parent of the application source.
COPY folder_1/requirements.txt .
RUN pip install -r requirements.txt
# Now copy in the rest of the application
COPY folder_1 .
# And also copy the shared data
COPY folder_data ./folder_data
# And have ordinary container startup metadata
CMD ["./code1.py"]
这里不要使用卷。 Docker 具有从图像内容填充命名卷的诱人行为,但如果重建,旧卷内容将优先于更新的图像内容,并且这仅适用于本机 Docker 卷(不适用于主机-目录绑定挂载,在 Kubernetes 中根本不存在)。更好的做法是拥有一个包含应用程序需要的所有内容的独立映像 运行,而不是拥有需要从外部注入关键内容的部分映像。
这可能是一个愚蠢的问题,但我是 Docker 的新手,我正在努力解决这个问题。我有一个包含许多子文件夹的项目,如下例所示:
project-folder:
folder_1:
code1.py
Dockerfile
requirements.txt
folder_2:
code2.py
Dockerfile
requirements.txt
folder_data:
file1
file2
file3
那么,我想这样做:
- 为所有容器在
project-folder
中维护我的工作目录; - 在每个容器内,我应该能够访问
folder_data
- 我知道我必须指定一个卷,我只是不知道如何在不保留我的project-folder
的情况下执行此操作作为工作目录; - 我需要将我的工作目录 (
project-folder
) 传递给我的 code1.py
注意: 只有当我在每个子文件夹中创建图像时,我的图像才成功创建,就像这样 Dockerfile:
FROM python:3.6-slim
COPY . /folder_1
WORKDIR /folder_1
RUN pip install -r requirements.txt
CMD ["python3", "code1.py", "$(pwd)"]
图像创建命令:
docker build -t image_folder1 .
我目前正在 folder_1
的上下文中创建图像,因为我无法在 project-folder
docker build
命令末尾的.
参数是上下文目录;您 COPY
放入图像中的任何内容都必须在此子树中。如果您需要在图像中包含其直接子树之外的内容,则需要使用祖先目录作为构建上下文,但您可以使用 docker build -f
选项在子目录中命名文件。
cd project-folder
docker build -t image_folder1 -f folder_1/Dockerfile .
在 Docker 文件中,由于您是从父目录开始的,因此您需要包含 COPY
中任何文件的相对路径;但是,现在允许包含以前的同级目录。
FROM python:3.6-slim
WORKDIR /app
# Good practice to copy just dependencies first; this helps
# layer caching when you repeat `docker build`.
# COPY source path is relative to the `docker build` directory,
# which we've set up to be the parent of the application source.
COPY folder_1/requirements.txt .
RUN pip install -r requirements.txt
# Now copy in the rest of the application
COPY folder_1 .
# And also copy the shared data
COPY folder_data ./folder_data
# And have ordinary container startup metadata
CMD ["./code1.py"]
这里不要使用卷。 Docker 具有从图像内容填充命名卷的诱人行为,但如果重建,旧卷内容将优先于更新的图像内容,并且这仅适用于本机 Docker 卷(不适用于主机-目录绑定挂载,在 Kubernetes 中根本不存在)。更好的做法是拥有一个包含应用程序需要的所有内容的独立映像 运行,而不是拥有需要从外部注入关键内容的部分映像。