基于 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?

在构建时使用 docker-compose 将环境变量传递给 docker 映像

基于docker-compose构建kafka,修改默认分区