此问题仅发生在Windows版本的Docker上(我运行的是Windows 10,Docker 20.10.17)。我有一个shell脚本,希望在构建Docker容器后运行。
它名为my_script.sh
,包含:
aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket
我的docker-compose.yml
文件是:
version: '3.8'
services:
localstack:
image: localstack/localstack:latest
environment:
- DEFAULT_REGION=ap-northeast-2
...
ports:
- '4566-4583:4566-4583'
volumes:
- ./my_script.sh:/docker-entrypoint-initaws.d/my_script.sh
在Mac/Linux版本的Docker上,当使用docker-compose up
时,此命令可以正确运行。
但是,在Windows版本上,它会出现以下错误:
...
localstack_1 | Ready.
localstack_1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initaws.d/my_script.sh
Parameter validation failed:ailed: s3://my-bucket
": Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$" or be an ARN matching the regex "^arn:(aws).*:(s3|s3-object-lambda):[a-z\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\-.]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\-]{1,63}$"
就好像Windows在自己的命令提示符而不是shell中运行此脚本一样。
如何让Windows将脚本解释为shell脚本?
2条答案
按热度按时间disbfnqx1#
如果您在Windows上打开并保存了
my_script.sh
文件,则该文件中可能存在CRLF(Windows)行结尾,Bash(脚本解释器)不会喜欢这种情况。你需要把它们转换成LF(Linux)行结尾,你可以用很多方法来做--请随意使用Google。一个简单快捷的方法是使用minimal online tool或
dos2unix
,这两种方法都可以为你做转换。在本地转换和替换文件后,确保你 * 不要 * 意外地在Git等中 checkout 文件,这可能会自动将行尾转换回CRLF。
确保您的用户具有在Windows中读取和执行文件的完全权限(Unix上为
chmod +x script.sh
)。请注意
/docker-entrypoint-initaws.d
目录现在也是deprecated,并且将在LocalStack 2.0版本中删除。为了适应未来的需要,我建议使用/etc/localstack/init/ready.d
,这将使您的hook进入“就绪”阶段。8ehkhllq2#
aws命令似乎被解释为Windows命令提示符中的命令,而不是shell中的命令。
你可以将脚本的扩展名从.sh更改为.ps1,这将通知命令提示符将脚本解释为PowerShell脚本。然后,你可以使用Invoke-WebRequest cmdlet运行aws命令,如下所示:
或者,您可以使用bash命令在Unix shell中运行脚本,如下所示: