Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Docker容器执行器出错_Sql Server_Docker_Dockerfile - Fatal编程技术网

Sql server Docker容器执行器出错

Sql server Docker容器执行器出错,sql-server,docker,dockerfile,Sql Server,Docker,Dockerfile,我有一个Dockerfile,用于构建SQL Server映像。我正在将SQL创建表脚本复制到图像中,并使用docker exec-it“execs.sh”调用此SQL脚本的execs.sh 我所看到的是,如果我使用“docker exec-it”调用execs.sh,它就会出错,但是如果我将shell放入容器并运行execs.sh它就会工作。我做错了什么 Dockerfile: FROM microsoft/mssql-server-linux COPY create_tables.sql .

我有一个Dockerfile,用于构建SQL Server映像。我正在将SQL创建表脚本复制到图像中,并使用
docker exec-it“execs.sh”
调用此SQL脚本的
execs.sh

我所看到的是,如果我使用
“docker exec-it”
调用
execs.sh
,它就会出错,但是如果我将shell放入容器并运行
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    
sh内容(从docker exec-it调用):

为容器编写脚本、运行容器并执行命令:

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

问题是,docker容器启动时您尝试强制执行的命令(在您的示例中:./create_tables.sql)将在docker启动的同一秒运行

SQL Server尚未启动,因此SQL文件甚至无法针对此服务运行


您必须在脚本中处理很长的等待时间,或者构建一个循环(例如,在退出之前,每秒检查SQL server是否可以访问100次)。

您缺少脚本顶部的解释器。当您从bash或sh等shell运行该脚本时,它假定您希望将其作为当前shell的shell脚本运行。但是,当您使用OS exec运行它时,没有shell假设您希望如何运行它。因此,您希望在脚本的第一行中包含以下内容:

#!/bin/sh
请确保这是用Linux linefeed完成的,而不是Windows linefeed,否则它会给您一个找不到的文件

#!/bin/sh