【问题标题】:Docker-compose volumes working with Dockerfile : Device or resource busy使用 Dockerfile 的 Docker-compose 卷:设备或资源繁忙
【发布时间】:2021-04-02 13:15:57
【问题描述】:

我在使用 Dockerfile 构建时遇到了使用 docker-compose 服务的问题。

确实,我在我的 app/ 文件夹中提供了一个 .env 文件。我希望将 .env 文件的 TAG 值传播/呈现到 config.ini 文件中。我尝试使用 entrypoint.sh(在卷之后启动)但它失败了。

有我的 docker-compose.yml 文件

# file docker-compose.yml

version: "3.4"

app-1:
  build: 
    context: ..
    dockerfile: deploy/Dockerfile
  image: my_image:${TAG}
  environment:
    - TAG=${TAG}
    volumes:
      - ../config.ini:/app/config.ini

然后是我的 Dockerfile:

# file Dockerfile

FROM python:3.9
RUN apt-get update -y
RUN apt-get install -y python-pip
COPY ./app /app
WORKDIR /app
RUN pip install -r requirements.txt
RUN chmod 755 entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["python", "hello_world.py"]

就我而言,我挂载了一个 config.ini 文件,其配置如下:

# file config.ini

[APP_INFO]
name = HELLO_WORLD
version = {TAG}

最后,在我的 app 文件夹中,我有一个 .env 文件,您可以在其中找到该应用程序的版本,该版本随着时间的推移而发展。

# file .env 

TAG=1.0.0

终于

#!/bin/bash

echo "TAG:${TAG}"

awk '{sub("{TAG}","${TAG}")}1' /app/config.ini > /app/final_config.ini

mv /app/final_config.ini /app/config.ini

exec "$@" # Need to execute RUN CMD function

我想要我的 entrypoint.sh(在最后一个 DOCKERFILE 行之前和 docker-compose 卷之后调用。使用 entrypoint.sh,我想用一个新文件覆盖我的挂载文件,使用 awk。 不幸的是,我恢复了标签,我可以创建一个 final_config.ini 文件,但我无法用它覆盖 config.ini。

我收到此错误:

mv: cannot move '/app/final_config.ini' to '/app/config.ini': Device or resource busy

如何在不出错的情况下覆盖 config.ini?有没有更简单的解决方案?

【问题讨论】:

  • 如果$TAG 是应用程序的版本,将其作为ARG 传递到映像构建中并将其包含在那里的配置中是否有意义?还是您希望最终用户提供包括{TAG} 参考的配置?
  • 我这样做是因为在入口点使用它更简单。但我应该只将它包含在 .env 文件中。感谢您的反映!

标签: docker docker-compose


【解决方案1】:

因为/app/config.ini 是一个挂载点,你不能替换它。你应该能够重写它,像这样......

cat /app/final_config.ini > /app/config.ini

...但是,这当然会修改您主机上的原始文件。对于您正在做的事情,更好的解决方案可能是将模板配置安装在备用位置,然后生成/app/config.ini。例如,挂载在/app/template_config.ini:

    volumes:
      - ../config.ini:/app/template_config.ini

然后修改你的脚本输出到最终位置:

#!/bin/bash

echo "TAG:${TAG}"

awk '{sub("{TAG}","${TAG}")}1' /app/template_config.ini > /app/config.ini

exec "$@" # Need to execute RUN CMD function

【讨论】:

  • 嗯,这显然是正确的做法^^'谢谢:)
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2016-08-29
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多