He creado el archivo Docker como a continuación,

FROM XXXXXX.dkr.ecr.eu-west-1.amazonaws.com/baseImage:1.0.0

ARG USER_NAME
ARG PASSWD

COPY --chown=sdc:sdc libs/mysql-connector-java-8.0.11.jar  ${SDC_HOME}/datacollector-jdbc-lib/lib/

#REPLACE CONFIG FILLE
COPY policies/config.properties "${SDC_CONF}"/config.properties

#######################################
# COPY  PIPELINE
#######################################

COPY --chown=sdc:sdc pipelines/fullload/sns.json  "${SDC_HOME}"/

COPY --chown=sdc:sdc postPipeline.sh /
RUN chmod 755 /postPipeline.sh

# Calling the script to post pipeline with argument1: pipeline name
#                    and argument2: pipeline filename
#                    and argument3: username(permission to deploy the pipeline)
#                    and argument3: password of above username
FROM base
RUN sed -i "/^exec.*/i \/postPipeline.sh  'fullload' 'sns.json' ${USER_NAME} ${PASSWD} &"  /docker-entrypoint.sh

#######################################

USER ${SDC_USER}
EXPOSE PORT

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["dc", "-exec"]

Esto funciona bien, si codifico el valor. Pero mi pregunta es, ¿cómo puedo pasar los argumentos durante el comando de ejecución para que postPipeline.sh se vea afectado por esos argumentos y no por el punto de entrada.

docker run -p port:port buildname <username> <passwd> 

Debido a que según el runbook de Docker, estos argumentos anularán el parámetro del punto de entrada actual. que no quiero

Por lo tanto, para preservar esto como argumentos probé a continuación, pero no esto no funciona, ya que quería pasar los argumentos en tiempo de ejecución y no en tiempo de compilación.

    FROM alpine:latest as base
    ARG USER_NAME
    ARG PASSWD

    ENV USER_NAME=${USER_NAME}
    ENV PASSWD=${PASSWD}

    FROM XXXXXX.dkr.ecr.eu-west-1.amazonaws.com/baseImage:1.0.0



        COPY --chown=sdc:sdc libs/mysql-connector-java-8.0.11.jar  ${SDC_HOME}/datacollector-jdbc-lib/lib/

        #REPLACE CONFIG FILLE
        COPY policies/config.properties "${SDC_CONF}"/config.properties

        #######################################
        # COPY  PIPELINE
        #######################################

        COPY --chown=sdc:sdc pipelines/fullload/sns.json  "${SDC_HOME}"/

        COPY --chown=sdc:sdc postPipeline.sh /
        RUN chmod 755 /postPipeline.sh

        # Calling the script to post pipeline with argument1: pipeline name
        #                    and argument2: pipeline filename
        #                    and argument3: username(permission to deploy the pipeline)
        #                    and argument3: password of above username
        FROM base
        RUN sed -i "/^exec.*/i \/postPipeline.sh  'fullload' 'sns.json' ${USER_NAME} ${PASSWD} &"  /docker-entrypoint.sh

        #######################################

        USER ${SDC_USER}
        EXPOSE PORT

        ENTRYPOINT ["/docker-entrypoint.sh"]
        CMD ["dc", "-exec"]

Crear etapas múltiples solo para argumentos para mí parece exagerado. Entonces, ¿hay algún consejo sobre cómo lograr esto?

1
change198 2 ene. 2020 a las 13:34

2 respuestas

La mejor respuesta

Puede pasar la configuración a los contenedores acoplables de varias maneras:

  1. Parámetros de línea de comando

  2. Variables de entorno

  3. Montaje de archivos de configuración

Para su caso de uso, entiendo que docker-entrypoint.sh llamará a postPipeline.sh internamente.

Si tiene acceso para modificar docker-entrypoint.sh, también puede hacer que tome los argumentos necesarios para postPipeline.sh y los pase internamente.

Si tiene acceso para modificar postPipeline.sh, puede hacer que lea la configuración de las variables de entorno.

Puede montar un archivo de configuración en el contenedor y modificar docker-entrypoint.sh o postPipeline.sh para leer los argumentos del archivo de configuración.

1
Shashank V 2 ene. 2020 a las 11:22

RUN ... postPipeline.sh se ejecuta en tiempo de compilación, por lo que obviamente no puede pasarle argumentos en tiempo de ejecución. Lo que podría hacer es envolver las llamadas al postPipeline.sh y docker-entrypoint.sh en otro script y llamarlo en el ENTRYPOINT.

0
Mafor 2 ene. 2020 a las 11:29