【问题标题】:Not able to locate and persist a file generated by a code that is run by a build Docker command无法找到并保存由构建 Docker 命令运行的代码生成的文件
【发布时间】:2021-04-13 08:46:00
【问题描述】:

我有一个 Dockerfile,我在其中调用了一个生成和创建 XML 报告的 python 代码。 当我构建 Dockerfile 时,python 代码会运行,但问题是我无法保留生成的 XML 报告。 Dockerfile如下:

FROM python:3.7.5-alpine3.10 as base
FROM base as builder
RUN mkdir /install
WORKDIR /install
pip install flask

COPY *.py /app/

WORKDIR /app
RUN python main.py

main.py 有一个生成 XML 报告的代码。 当我在 cmd 提示符下调用 python main.py 时,报告会生成并保存在代码所在的同一目录中。但是当我调用 build Docker(它又调用 RUN main.py)时,我无法找到报告。我搭建docker的方式如下:

docker build -f ./Dockerfile

只有根据报告输出的成功,我才决定是否创建docker镜像。

【问题讨论】:

  • 我认为您想要的是在本地访问您的脚本生成的.xml 文件,对吗?如果是这种情况,那么您必须使用volumes。通过创建卷,您将能够访问本地主机中容器内所有生成的文件。

标签: bash docker shell unix dockerfile


【解决方案1】:

给定以下文件

# Dockerfile

FROM python:alpine
RUN mkdir /app
WORKDIR /app
COPY *.py /app/
RUN python main.py
# main.py

import random
import sys

if __name__ == "__main__":
  num = random.randint(1, 10)
  print(num)
  with open("output.txt", "w") as f: f.write(str(num))
  sys.exit(0 if num % 2 == 0 else 1)

如果随机绘制的整数是偶数,则会创建一个名为foo 的docker镜像,否则会失败

docker build -f ./Dockerfile -t foo .

如果图像被创建,你可以通过

读取脚本的输出
docker run --rm foo cat /app/output.txt

如果您希望将输出文件复制为图像 - create a temporary container from the image, copy the file, then delete the container

id=$(docker create foo)
docker cp $id:/app/output.txt ./
docker rm -v $id

【讨论】:

  • 我没有在容器中运行任何东西。我只是在构建一个 dockerfile。图片尚未创建
  • 谢谢,但我不想'cat'文件,我想保留在我的本地文件夹(不是容器)中
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 2021-01-08
  • 2018-06-08
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多