Запустите скрипт в Docker

#linux #bash #docker

Вопрос:

У меня есть Докерфайл

 FROM ubuntu:20.04
RUN apt-get update amp;amp; apt-get install -y software-properties-common curl gnupg2 amp;amp; 
  curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add - amp;amp; 
  apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" amp;amp; 
  apt-get update amp;amp; apt-get install -y 
  vault amp;amp; 
  setcap cap_ipc_lock= /usr/bin/vault

COPY run.sh ./

CMD ./run.sh
 

И мой run.sh файл

 #!/bin/bash

VAULT_RETRIES=5
echo "Vault is starting..."
until vault status > /dev/null 2>amp;1 || [ "$VAULT_RETRIES" -eq 0 ]; do
        echo "Waiting for vault to start...: $((VAULT_RETRIES--))"
        sleep 1
done

echo "Authenticating to vault..."
vault login token=vault-plaintext-root-token

echo "Initializing vault..."
vault secrets enable -version=2 -path=my.secrets kv

echo "Adding entries..."
vault kv put my.secrets/dev username=test_user
vault kv put my.secrets/dev password=test_password

echo "Complete..."
 

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

/bin/sh: 1: ./run.sh: не найдено

Если я заменю

CMD ./run.sh

на

ЗАПУСТИТЕ chmod x run.sh

контейнер запускается без проблем, но скрипт не работает, потому что я не вижу в терминале эхо-команд

Комментарии:

1. Замена CMD на RUN не имеет никакого смысла-эти две команды делают совершенно разные вещи. CMD означает «выполните эту команду при запуске контейнера», в то время RUN как означает «выполните эту команду сейчас во время создания образа».

2. Что это такое WORKDIR ? Вы пробовали указать абсолютный путь к run.sh in CMD?

Ответ №1:

Моя проблема была в #!/bin/bash этом . Я переписал это дальше #!/bin bash , и мой сценарий работает. Но у меня была вторая проблема, это exec user process caused "permission denied" …. Эта проблема была решена — я добавил RUN chmod rx run.sh команду в файл Dockerfile, и кодировка скрипта должна быть utf-8 СПЕЦИФИКАЦИЯ (для Windows).