Dockerfile无法执行CMD命令(适用于Windows的Docker)

威化饼

对于dockerfile中的Windows,无法在docker上执行CMD命令。

我想使用CMD运行几个命令,但是连一个命令都无法运行。

我尝试了以下操作,但没有任何效果...

1。

CMD "sqlcmd -S database -i C:\db\db_scripts\upgradescript.sql -U sa -P mypassword"

2。

RUN ["powershell", "-NoProfile", "-Command", "c:\db\db_scripts\script.ps1"]

3。

CMD ["cmd", "sqlcmd", "-S", "database", "-i", "C:\db\db_scripts\upgradescript.sql", "-U", "sa", "-P", "mypassword"]

4。

ARG arg1=database
ARG arg2=C:\db\db_scripts\upgradescript.sql
ARG arg3=sa
ARG arg4=mypassword!

RUN ["cmd", "-NoProfile", "-Command", "sqlcmd -S $env:arg1 -i $env:arg2 -U $env:arg3 -P $env:arg4"]

5,

RUN powershell.exe  c:\db\db_scripts\script.ps1

6。

ENTRYPOINT ["powershell", "-NoProfile", "-Command", "sqlcmd"]
CMD ["-S database -i C:\db\db_scripts\upgradescript.sql -U sa -P mypassword"]

支持文件:

A.Script.ps1(供2和5使用)

cmd /c "sqlcmd -S database -i C:\db\db_scripts\upgradescript.sql -U sa -P mypassword"

B.Docker文件

# escape=`

FROM microsoft/mssql-server-windows-developer
COPY db\* c:\db\
COPY db_scripts\* c:\db\db_scripts\
ENV attach_dbs="[{'dbName':'ABC','dbFiles':['C:\db\ABC.mdf','C:\db\ABC_Log.ldf']},{'dbName':'XYZ','dbFiles':['C:\db\XYZ.mdf','C:\db\XYZ_Log.ldf']}]"
CMD "sqlcmd -S database -i C:\db\db_scripts\upgradescript.sql -U sa -P mypassword"

请注意,由于转义字符,我不需要使用“ \\”。

观察

容器启动并在几秒钟后消失。

如果我卸下CMD部件,则容器工作正常。我可以进入容器并可以sqlcmdcmdshell中运行以上命令

我在做什么错,缺少什么,有什么更好的方法等。任何人都可以给我一些指导吗?谢谢!

编辑:

根据Josh的回答,此ENTRYPOINT命令对我有用的唯一方法是(共享,以便其他人可以受益,甚至发布更好的方法)...

ENV arg1 database
ENV arg2 C:\db\db_scripts\upgradescript.sql
ENV arg3 sa
ENV arg4 mypassword
ENTRYPOINT ["powershell sleep(60); sqlcmd"]
CMD ["-S $env:arg1 -i $env:arg2 -U $env:arg3 -P $env:arg4"]
乔希·E

我认为您可能会误解CMD,ENTRYPOINT和RUN指令的性质。CMD和ENTRYPOINT都在容器启动/运行时生效,而RUN是构建时命令。有点令人困惑的是,您在docker构建过程中使用RUN来准备容器映像,而CMD是在容器中运行的。

通过文档

CMD的主要目的是为执行中的容器提供默认值...

任何给定的容器映像都只会有一个CMD指令。

Dockerfile中只能有一条CMD指令。如果您列出多个CMD,则只有最后一个CMD才会生效。

如果要确保可执行文件在容器启动时运行,则可以考虑使用ENTRYPOINT指令。将ENTRYPOINT视为提供CMD指令默认值的命令。从文档:

Dockerfile应该指定CMD或ENTRYPOINT命令中的至少一个。使用容器作为可执行文件时,应定义ENTRYPOINT。CMD应该用作定义ENTRYPOINT命令或在容器中执行临时命令的默认参数的方式。使用替代参数运行容器时,CMD将被覆盖。

RUN命令是一条构建时指令,可用于准备容器映像以及必要的文件,配置等。

有关ENTRYPOINT与CMD的更多信息,请参见此SO问题

ED:您正在研究在容器中运行SQL脚本的情况是一个棘手的问题,因为该脚本必须在数据库引擎准备好接受命令之前不运行。第一步,您可以在ENTRYPOINT指令中运行升级脚本。您也可以考虑通过docker exec命令运行SQL升级脚本容器后置备

ED2:提供的示例:

ENTRYPOINT ["powershell", "-NoProfile", "-Command", "sqlcmd"] CMD ["sqlcmd -S database -i C:\db\db_scripts\upgradescript.sql -U sa -P mypassword"]

之所以不起作用,是因为它可能导致胡说八道的命令行指令。请记住,CMD为ENTRYPOINT指令提供了参数,因此您只需在ENTRYPOINT中指定Powershell sqlcmd,而让CMD提供参数(未经测试,OTOMH):

ENTRYPOINT powershell sqlcmd -S database -U sa -P mypassword -i

CMD C:\db\db_scripts\upgradescript.sql

ED 3:通过组合两个语句并向;ENTRYPOINT添加语句终止符(),然后可以允许运行标准SQL容器。\ Start.ps1脚本,该脚本进入无限循环,以防止容器立即停止(容器仅在它们中已执行的进程正在运行的情况下运行)。即使用户在运行时覆盖CMD指令,这也可以确保启动脚本得以执行:

ENTRYPOINT powershell "sqlcmd -S database -U sa -P mypassword -i 'C:\db\db_scripts\upgradescript.sql';"

CMD .\Start.ps1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Windows-Docker CMD无法执行

无法执行Docker exec * ID * -it命令

即使适用于合并,Git也无法执行用于交互式基础的编辑器

适用于excel的BigQuery连接器-请求失败:错误。无法执行查询。提取网址时超时

Windows CMD-代码声明作为数组变量的值不适用于IF命令

为什么Python无法执行cmd命令“ tskill”?

RUN命令中的ARG替换不适用于Dockerfile

适用于Windows网络的Docker

Docker代理配置不适用于Dockerfile中的ADD

CMD / Powershell:命令不适用于cURL。Cygwin作品

cmd中的httpd命令不适用于Apache

无法在Docker容器中调用chown(适用于Windows的Docker)

无法更新\ tools-适用于Windows的Android SDK命令行工具

在odoo 10 Windows中无法执行命令lessc

无法执行ffprobe命令

无法执行 makemigrations 命令

适用于Windows的Docker桌面无法使用公司代理进行搜索/构建

在Linux Docker容器中运行时无法读取证书-适用于Windows

适用于Windows的Docker桌面:无法通过浏览器访问我的容器

无法在Azure Win 10 VM上启动``适用于Windows的Docker''

cURL 命令适用于 linux 但不适用于 windows

Slim Python Dockerfile无法执行

适用于Windows的VBoxManage Linux命令convertfromraw等效

适用于Docker的Shipyard v2无法登录

用于多命令执行的Docker CMD exec-form

如何将 PowerShell 命令转换为适用于 cmd 提示符的命令?

Windows Docker mongo容器不适用于卷挂载

在适用于Windows的Ubuntu App上安装Docker

docker --add-hostname不适用于Windows容器