我的印象是环境变量可以在一行上设置如下,以便最大限度地减少中间图像。
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'
问题:是否可以将环境变量的设置合并到一行?如果是这样,我该怎么做?这是一个好习惯吗?
答案 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及更高版本中,只有RUN
,COPY
和ADD
指令会创建图层。其他说明创建临时中间图像,不再直接增加构建的大小。
Docker 17.05及更高版本添加了对multi-stage builds的支持,允许您仅将所需的工件复制到最终图像中。这允许您在中间构建阶段包含工具和调试信息,而不会增加最终图像的大小。