Сценарий Bash завершается неудачно в процессе сборки Dockerfile - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть Dockerfile, который выглядит так:

FROM node:14.0.0 as dev-stage
WORKDIR /app
ENV NODE_ENV=development
COPY package.json ./
RUN yarn install

FROM node:14.0.0 as build-stage
WORKDIR /app
ENV NODE_ENV=production
COPY --from=dev-stage /app/node_modules node_modules
COPY . .
RUN yarn run build

FROM abiosoft/caddy:1.0.3
COPY Caddyfile /etc/Caddyfile

COPY --from=build-stage /app/dist /usr/share/caddy/html

WORKDIR /usr/share/caddy/html
COPY ./env.sh .
COPY .env .
RUN chmod +x env.sh && /usr/share/caddy/html/env.sh

и скрипт env.sh, который выглядит так:


# Recreate config file
rm -rf ./config.js
touch ./config.js

# Add assignment 
echo "window._env_ = {" >> ./config.js

# Read each line in .env file
# Each line represents key=value pairs
while read -r line || [[ -n "$line" ]];
do
  # Split env variables by character `=`
  if printf '%s\n' "$line" | grep -q -e '='; then
    varname=$(printf '%s\n' "$line" | sed -e 's/=.*//')
    varvalue=$(printf '%s\n' "$line" | sed -e 's/^[^=]*=//')
  fi

  # Read value of current variable if exists as Environment variable
  value=$(printf '%s\n' "${!varname}")
  # Otherwise use value from .env file
  [[ -z $value ]] && value=${varvalue}

  # Append configuration property to JS file
  echo "  $varname: \"$value\"," >> ./config.js
done < .env

echo "}" >> ./config.js

Когда я пытаюсь его собрать, я получаю это сообщение об ошибке

Step 18/18 : RUN chmod +x env.sh && /usr/share/caddy/html/env.sh
 ---> Running in 9e928ef2d9fd
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution
/usr/share/caddy/html/env.sh: line 27: syntax error: bad substitution

Локальный запуск сценария работает просто отлично, именно так, как я и предполагал, но не в процессе сборки Docker. Что мне здесь не хватает.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 28 апреля 2020

Ваш сценарий написан для bash, но вы запускаете его с /bin/sh, который на изображении node:14.0.0 равен , а не ссылкой на bash. Это традиционная оболочка POSIX.

Синтаксис ${!varname}, в частности, представляет собой bash -ism:

  value=$(printf '%s\n' "${!varname}")

Самый простой способ решить эту проблему - запустить скрипт с :

#!/bin/bash

Или просто измените свою последнюю строку RUN, чтобы она выглядела так:

RUN bash /usr/share/caddy/html/env.sh

Вот мой тест. Если я начну с env.sh, который выглядит следующим образом:

#!/bin/sh

foo=1
varname=foo
echo "foo is ${!varname}"

И это Dockerfile:

FROM node:14.0.0

COPY env.sh /tmp/env.sh
RUN chmod +x /tmp/env.sh; /tmp/env.sh

Сбой, как и ожидалось, с:

/tmp/env.sh: 5: /tmp/env.sh: Bad substitution

Но если я изменю Dockerfile, чтобы он выглядел так:

FROM node:14.0.0

COPY env.sh /tmp/env.sh
RUN bash /tmp/env.sh

Он работает как нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...