【问题标题】:Docker: Building within corporate firewall, deploying outside?Docker:在企业防火墙内构建,在外部部署?
【发布时间】:2019-02-06 16:07:45
【问题描述】:

我有一个软件套件(节点 Web 服务器、数据库、其他工具),我正在公司防火墙内开发,构建到 docker 映像中,并使用 docker-compose 进行部署。为了将所有软件实际安装到映像中,我需要设置环境以使用网络代理,并且还要禁用严格的 SSL 检查(因为防火墙包括 ssl 检查),不仅在环境变量方面,而且在对于npmapt 等等。

我已经完成了所有这些工作,因此我可以在防火墙内构建并在防火墙内部署,并设置了我的 Dockerfiles 和构建脚本,以便启用所有代理/ssl 配置内容依赖于 docker @987654323 @ 通过ENV enable_proxies=$my_build_arg 设置环境变量,因此我也可以轻松跳过所有用于在防火墙外构建和部署的配置。

但是,我需要能够在防火墙内构建所有内容,并在防火墙外进行部署。这意味着如果指定了相关的--build-arg,则必须在构建时启用所有代理内容(因此可以安装所有软件包),然后在运行时使用--env enable_proxies=true 或类似的东西单独启用或禁用.

我对Docker的某些方面还比较陌生,但我的理解是,镜像运行时唯一执行的是Dockerfile中CMD条目的内容,而CMD只能执行一个命令。

有谁知道我可以/应该如何在构建和运行时像这样分离代理/ssl 设置?

【问题讨论】:

    标签: docker proxy docker-compose dockerfile


    【解决方案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 设置的任何内容,而不必担心专门处理代理与非代理情况。

    【讨论】:

    • 多阶段构建听起来很理想,而且非常简单。根本不知道这个功能!
    猜你喜欢
    • 2011-01-05
    • 2021-09-17
    • 2010-09-16
    • 2019-02-07
    • 2011-05-16
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多