Dockerfile:在单行中设置多个环境变量

时间:2017-08-06 06:10:56

标签: docker dockerfile

我的印象是环境变量可以在一行上设置如下,以便最大限度地减少中间图像。

urlpatterns = [
    url(r'^$', view_api, name='api'),
    url(r'^(?P<ip>(?:(?:0|1[\d]{0,2}|2(?:[0-4]\d?|5[0-5]?|[6-9])?|[3-9]\d?)\.){3}(?:0|1[\d]{0,2}|2(?:[0-4]\d?|5[0-5]?|[6-9])?|[3-9]\d?))/(?P<pseudo>\w+)/$', view_ip_check_user, name='ip_check_user'),
]

但是,根据此代码段运行容器并调用FROM alpine:3.6 ENV RUBY_MAJOR 2.4 \ RUBY_VERSION 2.4.1 \ RUBY_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \ RUBYGEMS_VERSION 2.6.12 \ BUNDLER_VERSION 1.15.3 我发现变量没有单独分配,而是组合成一个字符串。

# set |grep RU

但是,如果我显式设置每个变量如下,我得到预期的输出,并且在调用变量时没有错误。

RUBY_MAJOR='2.4     RUBY_VERSION 2.4.1     RUBY_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654     RUBYGEMS_VERSION 2.6.12     BUNDLER_VERSION 1.15.3'

问题:是否可以将环境变量的设置合并到一行?如果是这样,我该怎么做?这是一个好习惯吗?

2 个答案:

答案 0 :(得分:72)

指定环境有两种格式。如果您需要单个变量,那么您将格式化

ENV X Y

这会将X指定为Y

ENX X Y Z

这会将X指定为Y Z

如果需要分配多个环境变量,则使用其他格式

ENV X=Y Z=A

这会将X指定为Y,将Z指定为A。所以你的Dockerfile应该是

FROM alpine:3.6
ENV RUBY_MAJOR=2.4 \
    RUBY_VERSION=2.4.1 \
    RUBY_DOWNLOAD_SHA256=4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \
    RUBYGEMS_VERSION=2.6.12 \
    BUNDLER_VERSION=1.15.3

RUN env

答案 1 :(得分:1)

您无需担心许多ENV命令,每个命令都会为您的Dockerfile创建的最终图像创建新的中间层。

来自Best practices for writing Dockerfiles

最小化层数

在Docker 17.05之前,甚至更多,在Docker 1.10之前,最大限度地减少图像中的图层数量非常重要。以下改进减轻了这种需求:

  • 在Docker 1.10及更高版本中,只有RUNCOPYADD指令会创建图层。其他说明创建临时中间图像,不再直接增加构建的大小。

  • Docker 17.05及更高版本添加了对multi-stage builds的支持,允许您仅将所需的工件复制到最终图像中。这允许您在中间构建阶段包含工具和调试信息,而不会增加最终图像的大小。