当前位置: 首页 > 面试题库 >

如何通过docker-compose使环境变量可用于Docker RUN命令?

段干飞翔
2023-03-14
问题内容

我有一个Dockerized应用程序,我想在代理和非代理主机环境中运行。我正试图通过将普通环境变量(例如http_proxy)复制到容器中(如果且仅当它们存在于主机中时)来解决此问题。

我可以通过跑步获得90%的路程

set | grep -i _proxy=>proxies.env

在顶层脚本中,然后在我的docker-compose.yml中包含:

myserver:
  build: ./myserver
  env_file:
   - proxies.env

这会将主机的环境代理变量(如果有)复制到服务器容器中,并且在容器运行时可用这些变量的意义上起作用,换句话说,就是在Dockerfile
CMD或ENTRYPOINT执行阶段。

但是,我有一个需要在构建步骤中运行npm的容器,即从Dockerfile中的RUN命令运行,并且这些变量在此阶段似乎不存在,因此npm找不到代理并挂起。在其他作品中,如果我有

RUN set

在我的Dockerfile中,我看不到来自proxies.env的任何变量,但是如果我这样做

docker exec -it myserver /bin/bash

然后运行set,我可以从proxies.env中看到所有内容。

谁能推荐一种在容器构建时使这些变量可见的方法,而不必对其进行硬编码,从而使我的docker-
compose.yml和Dockerfile仍然适用于具有代理的主机和不具有代理的主机?

(与centos 7,docker-compose 1.3.1和docker 1.7.0一起运行)


问题答案:

也许您可以尝试以下方法:

调用之前RUNADD.env文件进入图像

ADD proxies.env proxies.env

然后为您的RUN语句添加前缀:

RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"

这将产生以下输出:

root@armenubuntudev:~/Dockers/set-env# docker build -t ashimoon/envtest .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> 91e54dfb1179
Step 1 : ADD proxies.env proxies.env
 ---> Using cache
 ---> 181d0e082e65
Step 2 : RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"
 ---> Running in 30426910a450
FOO is 1 and BAR is 2
 ---> 5d88fcac522c
Removing intermediate container 30426910a450
Successfully built 5d88fcac522c


 类似资料:
  • 问题内容: 我正在尝试设置一个postgres容器,并希望使用以下命令设置postgres登录名: 所以我像这样创建了docker-compose.yml 我还尝试了将环境变量声明为db部分的其他语法: 但是这些选项似乎都不起作用,因为无论出于什么原因,无论何时我尝试使用各种连接字符串连接到postgres数据库: 与抱怨没有用户数据库相反,它们都给我身份验证失败。 问题答案: 您收到的身份验证错

  • 我希望能够在docker compose中使用env变量。yml,值在docker compose up时传入。这就是一个例子。 我今天用基本的docker run命令来做这件事,它包含在我自己的脚本中。有没有一种方法可以在没有任何bash包装器的情况下用compose实现它?

  • 问题内容: 我希望能够在docker-compose.yml中使用env变量,并在docker-compose时传入值。这就是例子。我今天使用基本的docker run命令来执行此操作,该命令包装在我自己的脚本中。没有任何这样的bash包装器,有没有办法通过compose实现它? 问题答案: 创建一个,这是您的with环境变量。 假设您的环境变量在文件“ env.sh”中 将以下代码放入sh文件中

  • 问题内容: 使用v2,可以简单地设置环境变量: 完整文件为: 但是,如何转义不是纯字符串的环境变量? 我试过了: 错误:yaml.parser.ParserError:解析“ ./docker-compose.yml”第6行中的块映射时,预期第9列,但在“ ./docker-compose.yml”第6行中找到了“}”。第92栏 问题答案: 环境变量(包括姓名), 有单或双引号内被完全包裹 :或

  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0

  • 我在yaml文件中定义了一个环境变量JAVA_TOOL_OPTIONS。当我使用命令“docker compose-f up”启动容器时,我会出现以下错误: 拾取JAVA_TOOL_OPTIONS:-agentlib: jdwp=传输=dt_socket, address=8010, server=y,挂起=n监听传输dt_socketat address: 8010拾取JAVA_TOOL_OPT