【问题标题】:running docker container is not overwritting a txt file with python运行 docker 容器不会用 python 覆盖 txt 文件
【发布时间】:2021-11-11 19:53:28
【问题描述】:

我有一个 python 脚本可以更改文件的第一行,它可以在本地工作,但在运行 docker 容器时不能。

目录结构

my_workdir
├─── Dockerfile
├─── docker-compose.yml
├─── script.py
└─── data
    └─── r2.txt

这是我的python代码

a_file = open("data/r2.txt", "r")
list_of_lines = a_file.readlines()
list_of_lines[0] = "1\n"
a_file = open("data/r2.txt", "a")
a_file.writelines(list_of_lines)
a_file.close()

它基本上将“r2.txt”中的第一行更改为“1”,但是当我检查 txt 文件时并没有更改它。我正在阅读您需要安装一个卷,所以我将以下内容添加到我的 docker-compose.yml 文件中

version: "3"
services:
  app:
    image: imagen-c1
    container_name: c1
    privileged: true
    deploy:
      replicas: 1
      update_config:
        parallelism: 1
        delay: 5s
      restart_policy:
        condition: on-failure
    build: .
    environment:
      - DISPLAY=${DISPLAY}
      - LEGACY_IPTABLES=true 
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ./:/data #HERE IS THE VOLUME

这是我的 dockerfile

FROM python:3.9-alpine

RUN pip install selenium

RUN apk add chromium
RUN apk add chromium-chromedriver


ENV CHROME_BIN=/usr/bin/chromium-browser \
    CHROME_PATH=/usr/lib/chromium/
ENV HOME /home/user-machine
    
RUN pip install webdriver_manager
WORKDIR ./
COPY ["script.py", "data/", "./"]
CMD python3 script.py

也许我没有正确执行,因为文件保持不变。

【问题讨论】:

  • 您的问题缺少重要信息。你的docker-compose.yml 是什么样的?你的 Dockerfile 呢?您的 Python 代码正在寻找 data 目录作为其当前目录的子目录;你确定你的 cwd 是你认为的那样吗?
  • 对不起,我更新了内容

标签: python linux docker docker-compose dockerfile


【解决方案1】:

我认为您当前的代码存在 2 个问题。

  1. COPY ["script.py", "data/", "./"]

    inside_container_root
    ├─── script.py
    └─── r2.txt
    

    以上是结果,根据this SO answer

    试试ls -l看看是不是真的这样:

    docker build -t my_image
    docker run my_image ls -l
    

    这可能是你想要的:

    COPY script.py ./
    ADD data data
    

    ADD可以复制目录

  2. 我认为文件data/r2.txt 将是只读的,因为它是图像中的一个文件。一旦您解决了 (1),您的 script.py 应该会出现错误提示 您正在尝试编写只读文件。我认为创建图像后整个data/ 目录不可写。更新的文件需要是图像中不存在的文件夹。喜欢data_out。如果您不需要在容器外使用新文件的内容,则不需要挂载卷。挂载卷是为了能够从容器外部检索文件。要获取可写目录,只需确保镜像中不存在可写目录即可。

     a_file = open("data_out/r2.txt", "a")
    

    你可能想要这样的东西。

【讨论】:

  • 我尝试在文件夹之外执行此操作,但得到了相同的结果,它写入容器的文件系统而不是原始文件。
  • 原始文件变为只读。我们将无法写入它。我认为这是 docker 的现有设计。您能解释一下为什么要覆盖现有文件吗?一个想法,使用r2-template.txt 作为您的输入文件。然后r2.txt 作为你的输出文件。这对您的用例有用吗?
  • 我想覆盖,因为我需要不断更改它,但由于它没有保留更改,我认为我需要一种在原件上书写的方法。我会尝试你所说的模板希望它能正常工作,我的主要目标是在更改文件后保持文件的状态,即使容器重新启动
  • @Chaos_Is_Harmony 与我的问题无关。我需要编辑一个 txt 文件的内容并保留这些更改,而不是文件的名称,文件的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 2012-04-19
  • 2021-01-19
相关资源
最近更新 更多