Docker, один или несколько build-args, где не потребляется

Я пытаюсь создать образ Oracle WebLogic Docker с настраиваемыми переменными среды

$ docker build -t 12213-domain --build-arg ADMIN_PORT=8888 --build-arg ADMIN_PASSWORD=wls .

но я вижу следующее предупреждение в журнале сборки

[Warning] One or more build-args [ADMIN_PASSWORD ADMIN_PORT] were not consumed

Вот файл Docker образа, который я пытаюсь построить.

#Copyright (c) 2014-2017 Oracle and/or its affiliates. All rights reserved.
#
#Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
#
# ORACLE DOCKERFILES PROJECT
# --------------------------
# This Dockerfile extends the Oracle WebLogic image by creating a sample domain.
#
# Util scripts are copied into the image enabling users to plug NodeManager 
# automatically into the AdminServer running on another container.
#
# HOW TO BUILD THIS IMAGE
# -----------------------
# Put all downloaded files in the same directory as this Dockerfile
# Run: 
#      $ sudo docker build -t 12213-domain
#
# Pull base image
# ---------------
FROM oracle/weblogic:12.2.1.3-developer

# Maintainer
# ----------
MAINTAINER Monica Riccelli <[email protected]>

# WLS Configuration 
# ---------------------------
ENV ADMIN_HOST="wlsadmin" \
    NM_PORT="5556" \
    MS_PORT="8001" \
    DEBUG_PORT="8453" \
    ORACLE_HOME=/u01/oracle \
    SCRIPT_FILE=/u01/oracle/createAndStartWLSDomain.sh \
    CONFIG_JVM_ARGS="-Dweblogic.security.SSL.ignoreHostnameVerification=true"  \
    PATH=$PATH:/u01/oracle/oracle_common/common/bin:/u01/oracle/wlserver/common/bin:/u01/oracle/user_projects/domains/${DOMAIN_NAME:-base_domain}/bin:/u01/oracle

# Domain and Server environment variables
# ------------------------------------------------------------
ENV DOMAIN_NAME="${DOMAIN_NAME:-base_domain}" \
    PRE_DOMAIN_HOME=/u01/oracle/user_projects \
    ADMIN_PORT="${ADMIN_PORT:-7001}"  \
    ADMIN_USERNAME="${ADMIN_USERNAME:-weblogic}" \
    ADMIN_NAME="${ADMIN_NAME:-AdminServer}" \
    MS_NAME="${MS_NAME:-""}" \
    NM_NAME="${NM_NAME:-""}" \
    ADMIN_PASSWORD="${ADMIN_PASSWORD:-""}" \
    CLUSTER_NAME="${CLUSTER_NAME:-DockerCluster}" \
    DEBUG_FLAG=true \
    PRODUCTION_MODE=dev 

# Add files required to build this image
COPY container-scripts/* /u01/oracle/

#Create directory where domain will be written to
USER root
RUN chmod +xw /u01/oracle/*.sh && \ 
    chmod +xw /u01/oracle/*.py && \ 
    mkdir -p $PRE_DOMAIN_HOME && \ 
    chmod a+xr $PRE_DOMAIN_HOME && \
    chown -R oracle:oracle $PRE_DOMAIN_HOME

VOLUME $PRE_DOMAIN_HOME
# Expose Node Manager default port, and also default for admin and managed server 
EXPOSE $NM_PORT $ADMIN_PORT $MS_PORT $DEBUG_PORT

USER oracle
WORKDIR $ORACLE_HOME

# Define default command to start bash. 
CMD ["/u01/oracle/createAndStartWLSDomain.sh"]

Я запускаю docker-toolbox на окнах, а версия докера

$ docker --version
Docker version 18.03.0-ce, build 0520e24302

Ответы

Ответ 1

ARG

ARG <name>[=<default value>]

Инструкция ARG определяет переменную, в которую пользователи могут передавать время сборки для сборщика с помощью команды сборки docker, использующей --build-arg = флаг. Если пользователь указывает аргумент сборки, который не был определен в файле Docker, сборка выводит предупреждение.

[Warning] One or more build-args [foo] were not consumed.

https://docs.docker.com/engine/reference/builder/#arg

Использование переменных ARG

Вы можете использовать инструкцию ARG или ENV для указания переменных, которые доступно для инструкции RUN. Переменные среды, определенные с помощью инструкция ENV всегда перекрывает инструкцию ARG одного и того же имя. Рассмотрите этот Dockerfile с инструкцией ENV и ARG.

В отличие от инструкции ARG, значения ENV всегда сохраняются в встроенное изображение. Рассмотрим сборку докера без флага --build-arg:

ARG доступен только во время сборки образа Docker (RUN и т.д.), А не после того, как образ создан и контейнеры из него запускаются (ENTRYPOINT, CMD). Вы можете использовать значения ARG, чтобы установить значения ENV, чтобы обойти это.

Так что вам нужно сделать что-то вроде этого

# Assign any default value to avoid any error. do not worry your build flag will override this.

    ARG ADMIN_PORT=some_default_value 

    ENV ADMIN_PORT=${ADMIN_PORT}

https://vsupalov.com/docker-arg-env-variable-guide/

Обновление:

Проще говоря, если вы передадите ARG, такие как --build-arg SOME_ARG=some_value, в сборку Docker и не объявите ARGS в Dockerfile, это предупреждение будет напечатано.

мой Dockerfile для использования ARG

FROM alpine
ARG SOME_ARG="Default_Value"
RUN echo "ARGS is ${SOME_ARG}"

Команда сборки

docker build --no-cache --build-arg SOME_ARG=some_value -t alpine .

Поэтому он не будет печатать предупреждение, так как ARGS объявлен в моем Dockerfile.

Теперь, если попытаться удалить ARGS из Dockerfile и построить образ

FROM alpine
RUN echo "without ARGS dockerfile"

Команда сборки

docker build --no-cache --build-arg SOME_ARG=some_value -t alpine .

Итак, теперь мы получим [Предупреждение] Один или несколько аргументов сборки [SOME_ARG] не были использованы, поскольку мы не использовали или не объявили SOME_ARG в нашем файле Docker.

enter image description here