基于 docker-compose 环境变量将文件添加到 docker 容器
Posted
技术标签:
【中文标题】基于 docker-compose 环境变量将文件添加到 docker 容器【英文标题】:Adding files to docker container based on a docker-compose Environment variables 【发布时间】:2020-11-14 17:47:45 【问题描述】:我有大量的测试文件 (3.2 gb),如果设置了环境变量 (DEBUG),我只想将它们添加到容器中。为了在本地进行测试,我将这些设置在 docker-compose 文件中。
到目前为止,我已将测试数据文件夹添加到 .dockerignore 文件中,并尝试了我的 Dockerfile 中提到的here 解决方案,但没有任何成功。
我还尝试在我的 docker 文件中调用的 run_app.sh
中运行 cp
命令:
cp local/folder app/testdata
但是得到cp: cannot stat 'local/folder': No such file or directory
,我猜是因为它试图在容器内找到我本地机器上存在的文件夹?
这是我的 docker 文件:
RUN mkdir /app
WORKDIR /app
ADD . /app/
ARG DEBUG
RUN if [ "x$DEBUG" = "True" ] ; echo "Argument not provided" ; echo "Argument is $arg" ; fi
RUN pip install -r requirements.txt
USER nobody
ENV PORT 5000
EXPOSE $PORT
CMD /uus/run_app.sh
【问题讨论】:
恐怕这里唯一的解决方案是拥有两个 Dockerfile——一个用于调试目的,另一个用于生产/其他。你可以编写一个 shell 脚本来构建特定的图像,但是你不能在 Dockerfile 本身中使用条件。 【参考方案1】:如果它真的只是为了测试,并且它位于一个明确命名的隔离目录中,如testdata
,您可以使用bind mount 注入它。
删除ARG DEBUG
和构建时选项以将内容复制到图像中。运行容器时,使用
docker run \
-v $PWD/local/folder:/app/testdata:ro \
...
这使得该主机文件夹出现在该容器目录中,只读,因此您不会意外覆盖测试数据以供以后运行。
请注意,这会隐藏该路径上图像中的任何内容;因此“如果它在一个单独的目录中,那么……”免责声明。
【讨论】:
以上是关于基于 docker-compose 环境变量将文件添加到 docker 容器的主要内容,如果未能解决你的问题,请参考以下文章
使用 nginx 将环境变量从 docker-compose 传递到 vue 应用程序
如何将环境变量从 docker-compose 传递给项目?
基于 docker 环境变量切换 spring 配置文件不起作用
如何从.env文件获取环境变量到docker-compose.yml?