Sql server Docker容器执行器出错
我有一个Dockerfile,用于构建SQL Server映像。我正在将SQL创建表脚本复制到图像中,并使用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 .
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