Dockerfile中使用AWS CLI上传React构建产物至S3时容器启动报错
问题
尝试在Docker容器内自动化完成React应用的构建流程,并通过Dockerfile中的AWS CLI将构建产物上传至S3存储桶,但执行docker-compose up命令时遇到错误。
Dockerfile配置
FROM node:16 as builder WORKDIR /app COPY package*.json ./ # Install dependencies RUN npm install COPY . . RUN npm run build # Use AWS CLI version 2 image for uploading to S3 FROM amazon/aws-cli:2.4.9 # Copy the build artifacts from the builder stage to this new stage COPY --from=builder /app/build /build # The bucket name and (optional) path where you want to upload the build files ENV BUCKET_NAME=product-build # Run AWS CLI command to sync files to your S3 bucket CMD ["sh", "-c", "aws s3 sync /build s3://${BUCKET_NAME} --delete"]
docker-compose.yml配置
version: '3.3' services: product-build: build: ./ volumes: - ./:/app env_file: - .env stdin_open: true
.env文件内容
AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=
报错信息
执行docker-compose build时构建流程成功完成,但运行docker-compose up后容器启动失败,报错如下:
Container react-app-product-build-1 Recreate Container react-app-product-build-1 Recreated Attaching to react-app-product-build-1 react-app-product-build-1 | react-app-product-build-1 | usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] react-app-product-build-1 | To see help text, you can run: react-app-product-build-1 | react-app-product-build-1 | aws help react-app-product-build-1 | aws <command> help react-app-product-build-1 | aws <command> <subcommand> help react-app-product-build-1 | react-app-product-build-1 | aws: error: argument command: Invalid choice, valid choices are: [list of valid AWS CLI commands] react-app-product-build-1 exited with code 252
容器内的AWS CLI无法正常识别命令,如何解决以成功将React构建产物上传至S3?
解决方案
1. 移除不必要的卷挂载
你的docker-compose.yml中挂载了./:/app,但最终运行的是AWS CLI阶段的镜像,这个阶段容器内的/app目录无实际作用,反而可能干扰环境变量或路径解析。直接删除该卷配置:
version: '3.3' services: product-build: build: ./ env_file: - .env
2. 补全AWS环境变量有效值
检查.env文件,确保AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION都填写了正确的账号信息,空值会导致AWS CLI无法完成初始化,进而抛出命令识别错误。
3. 验证AWS CLI基础可用性
临时修改Dockerfile的CMD命令,测试AWS CLI是否能正常运行:
CMD ["aws", "--version"]
重新构建并运行容器,如果能输出CLI版本信息,说明CLI本身无问题,问题出在命令参数或权限配置上。
4. 优化CMD命令写法
保持shell解析环境变量的同时,简化命令写法,避免不必要的转义问题:
CMD aws s3 sync /build s3://${BUCKET_NAME} --delete
5. 确认S3桶权限
确保AWS账号对应的Access Key拥有目标S3桶的ListBucket、PutObject、DeleteObject权限,权限不足也可能导致命令执行异常。
内容的提问来源于stack exchange,提问作者Muhammad AbuBaker
相关产品推荐
相关产品推荐

