Docker exe-контейнер c ошибок - PullRequest
1 голос
/ 03 августа 2020

У меня есть файл Dockerfile, который создает образ сервера SQL. Я копирую сценарий создания таблицы SQL в изображение и execs.sh, который вызывает этот сценарий SQL, используя docker exec -it "execs.sh".

Я вижу, что он выдает ошибку, если я вызываю execs.sh используя "docker exec -it", но если я помещаю оболочку в контейнер и запускаю execs.sh, он работает. Что я делаю не так?

Dockerfile:

FROM microsoft/mssql-server-linux
COPY create_tables.sql .
COPY execs.sh .
# set environment variables
ENV MSSQL_SA_PASSWORD=P@ssw0rd
ENV ACCEPT_EULA=Y    

execs. sh содержимое (вызывается из docker exe c -it):

echo "Executing SQL scripts"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i ./create_tables.sql

Скрипт сборки контейнера, его запуск и выполнение команд:

docker build -t mssql_test .
docker run -p 1433:1433 --name mssql2 -d mssql_test
docker exec -it mssql2 "/execs.sh"
docker exec -it mssql2 "ls"

Вывод:

OCI runtime exec failed: exec failed: container_linux.go:349: starting container process 
caused "exec format error": unknown
bin       create_tables.sql  execs.sh    lib    mnt   root  srv  usr
boot          dev            home    lib64  opt   run   sys  var
etc          install.sh  media  proc  sbin  tmp

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вам не хватает интерпретатора в верхней части скрипта. Когда вы запускаете это из оболочки, например bash или sh, предполагается, что вы хотите запустить его как сценарий оболочки с текущей оболочкой. Но когда вы запускаете его с ОС exe c, оболочка не предполагает, как вы хотите ее запускать. Поэтому вы хотите, чтобы в первой строке вашего скрипта было следующее:

#!/bin/sh

И убедитесь, что это сделано с Linux переводами строки, а не Windows переводами строки, иначе вы получите файл, который не найден *. 1004 *

0 голосов
/ 03 августа 2020

Проблема в том, что команда, которую вы пытаетесь вызвать при запуске контейнера docker (в вашем случае: ./create_tables.sql), будет запущена в ту же секунду, что и запуск docker.

Сервер SQL еще не запущен, поэтому файл sql не мог даже работать с этой службой.

Вы должны работать либо с большим временем ожидания в вашем скрипте, либо с сборкой al oop (например, проверять каждую секунду, доступен ли сервер SQL 100 раз перед выходом).

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