【发布时间】: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