docker - передать аргументы скрипту во время сборки - PullRequest
1 голос
/ 01 октября 2019

Я хотел бы передать аргумент (из команды docker) сценарию оболочки внутри Dockerfile.

Это командная строка docker.

docker build --file=DockerfileTest --build-arg docker_image=PX-release-migration  --tag=test-image:latest --rm=true  .

Это скрипт, который вызывается внутри Dockerfile.

#!/bin/sh -e
image_name=$1
echo "docker image is $image_name"

if [[ ($image_name == '') || ($image_name == *"-dev-"*) ]]; then
    echo "This is development"
    cp src/main/resources/application-dev.properties src/main/resources/application.properties
elif [[ $image_name == *"-preprod-"* ]]; then
    echo "This is preprod"
    cp src/main/resources/application-stg.properties src/main/resources/application.properties
elif [[ $image_name == *"-release-"* ]]; then
    echo "This is production"
    cp src/main/resources/application-prod.properties src/main/resources/application.properties
fi

Когда я выполняю скрипт отдельно, онработает, но он делает

Это файл Docker.

ARG spring_env=local
ARG docker_image=-local-

FROM maven:3.6.1-jdk-8
COPY . /apps/demo

WORKDIR /apps/demo

RUN chmod +x /apps/demo/initialize_env.sh
RUN ./initialize_env.sh $docker_image

RUN echo "spring_env is ${spring_env}"

Итак, я хотел бы использовать другой файл свойств приложения Spring во время сборки в зависимости от имени docker_image. Если имя образа докера содержит 'release', я хотел бы упаковать application-prod.properties во время сборки.

Это сообщение об ошибке, которое я получаю.

Step 1/8 : ARG spring_env=local
Step 2/8 : ARG docker_image=-local-
Step 3/8 : FROM maven:3.6.1-jdk-8
 ---> 4c81be38db66
Step 4/8 : COPY . /apps/demo
 ---> 41439197c465
Step 5/8 : WORKDIR /apps/demo
 ---> Running in 56bd408c2eb1
Removing intermediate container 56bd408c2eb1
 ---> 4c4025bf5f64
Step 6/8 : RUN chmod +x /apps/demo/initialize_env.sh
 ---> Running in 18dc3a5c1a54
Removing intermediate container 18dc3a5c1a54
 ---> 60d2037a0209
Step 7/8 : RUN ./initialize_env.sh $docker_image
 ---> Running in 2e049b2cf630
docker image is 
./initialize_env.sh: 5: ./initialize_env.sh: Syntax error: word unexpected (expecting ")")
The command '/bin/sh -c ./initialize_env.sh $docker_image' returned a non-zero code: 2

Когда я выполняю скрипт отдельно, он работает, но не внутри контейнера докера.

1 Ответ

1 голос
/ 01 октября 2019

Совет: Используйте ShellCheck для проверки сценариев на наличие синтаксических ошибок.

#!/bin/sh -e
if [[ ($image_name == '') || ($image_name == *"-dev-"*) ]]; then

[[ - синтаксис bashно ваш сценарий объявлен для использования простого sh. Он работает на вашем компьютере, предположительно, потому что sh действительно символически связан с bash, но внутри контейнера это не так. maven:3.6.1-jdk-8 основан на debian:stretch, в котором вместо bash используется тире .

Изменить строку Шебанга. Вы также можете удалить скобки;они излишни.

#!/bin/bash -e
if [[ $image_name == '' || $image_name == *"-dev-"* ]]; then

Вы также можете использовать блок case для упрощения повторяющихся проверок.

case "$image_name" in
    ''|*-dev-*)
        echo "This is development"
        cp src/main/resources/application-dev.properties src/main/resources/application.properties
        ;;

    *-preprod-*)
        echo "This is preprod"
        cp src/main/resources/application-stg.properties src/main/resources/application.properties
        ;;

    *-release-*)
        echo "This is production"
        cp src/main/resources/application-prod.properties src/main/resources/application.properties
        ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...