我有一个软件套件(节点Web服务器,数据库,其他工具),我正在公司防火墙内部开发该软件套件,将其构建到docker映像中,并使用docker-compose进行部署。为了将所有软件实际安装到映像中,我需要设置环境以使用网络代理,并禁用严格的SSL检查(因为防火墙包括ssl检查),不仅在环境变量方面,而且npm
,apt
等。
我已经完成了所有这些工作,以便可以在防火墙内构建并在防火墙内进行部署,并设置了Dockerfile和构建脚本,以便启用所有proxy / ssl配置内容取决于docker {{ 1}}可以通过--build-arg
设置环境变量,因此我也可以轻松地跳过所有用于在防火墙外部进行构建和部署的配置。
但是,我需要能够在防火墙内部构建所有内容,并在防火墙外部进行部署。这意味着,如果指定了相关的ENV enable_proxies=$my_build_arg
,则必须在构建时启用所有代理资源(以便可以全部安装软件包),然后在运行时使用{{1}分别启用或禁用}或类似的内容。
我对Docker的某些方面还比较陌生,但是我的理解是,运行映像时唯一执行的操作是Dockerfile中--build-arg
条目的内容,以及{{1} }只能执行一个命令。
有人知道这样/应该如何在构建和运行时分隔代理/ ssl设置吗?
答案 0 :(得分:1)
您应该能够构建和发布单个图像; “在防火墙内部构建,在外部部署”是很正常的。
对此可行的一种方法是使用Docker的多阶段构建功能以具有两个阶段。第一个可能具有特殊的代理设置并获取依赖项;第二个是实际的运行时映像。
FROM ... AS build
ARG my_build_arg
ENV enable_proxies=$my_build_arg
WORKDIR /artifacts
RUN curl http://internal.source.example.com/...
FROM ...
COPY --from=build /artifacts/ /artifacts/
...
CMD ["the_app"]
由于第二阶段没有ENV
指令,因此永远不会设置$enable_proxies
,这是实际运行时映像所需的。
另一种类似的方法是编写一个在主机上运行的脚本,该脚本将依赖项下载到本地构建树中,然后运行docker build
。 (如果需要支持特别老的Docker,可能需要这样做。)然后,您可以使用主机为$http_proxy
设置的任何内容,而不必担心专门处理代理与非代理情况。