docker 为什么我的Localstack入口点脚本可以在Linux/Mac OS上运行而不能在Windows上运行?

ep6jt1vc  于 2022-12-22  发布在  Docker
关注(0)|答案(2)|浏览(142)

此问题仅发生在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脚本?

disbfnqx

disbfnqx1#

如果您在Windows上打开并保存了my_script.sh文件,则该文件中可能存在CRLF(Windows)行结尾,Bash(脚本解释器)不会喜欢这种情况。
你需要把它们转换成LF(Linux)行结尾,你可以用很多方法来做--请随意使用Google。一个简单快捷的方法是使用minimal online tooldos2unix,这两种方法都可以为你做转换。
在本地转换和替换文件后,确保你 * 不要 * 意外地在Git等中 checkout 文件,这可能会自动将行尾转换回CRLF。
确保您的用户具有在Windows中读取和执行文件的完全权限(Unix上为chmod +x script.sh)。
请注意/docker-entrypoint-initaws.d目录现在也是deprecated,并且将在LocalStack 2.0版本中删除。为了适应未来的需要,我建议使用/etc/localstack/init/ready.d,这将使您的hook进入“就绪”阶段。

8ehkhllq

8ehkhllq2#

aws命令似乎被解释为Windows命令提示符中的命令,而不是shell中的命令。
你可以将脚本的扩展名从.sh更改为.ps1,这将通知命令提示符将脚本解释为PowerShell脚本。然后,你可以使用Invoke-WebRequest cmdlet运行aws命令,如下所示:

Invoke-WebRequest -Uri 'http://localhost:4566/s3/my-bucket' -Method PUT

或者,您可以使用bash命令在Unix shell中运行脚本,如下所示:

bash -c 'aws --endpoint-url=http://localhost:4566 s3 mb s3://my-bucket'

相关问题