我正在try 自动化在Docker容器中构建Reaction应用程序,然后使用Dockerfile中的AWS CLI将构建构件上载到S3存储桶的过程.然而,我在try 运行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似乎无法在Docker容器中正确识别该命令,尽管它应该是可用的.如何使用Dockerfile中的AWS CLI解决此问题并将构建成果成功上传到S3?

提前感谢您能提供的任何见解或解决方案!

推荐答案

来自AWS docs家(我认为它们比Docker Docs更好地解释了这一特殊情况):

让我们从一个例子开始.下面是一个同时包含ENTRYPOINTCMD的Dockerfile片段,两者都指定为数组:

 ENTRYPOINT ["/bin/chamber", "exec", "production", "--"]
 CMD ["/bin/service", "-d"]

把这些放在一起,容器的默认参数将是 ["/bin/chamber", "exec", "production", "--", "/bin/service", "-d"].

这就是这里正在发生的事情.

您正在使用的坞站图像是在这Dockerfile的基础上构建的,它提供了ENTRYPOINT:

ENTRYPOINT ["/usr/local/bin/aws"]

然后您提供CMD:

CMD ["sh", "-c", "aws s3 sync /build s3://${BUCKET_NAME} --delete"]

这两个参数组合在一起,结果是/usr/local/bin/aws sh -c "aws s3 sync /build s3://${BUCKET_NAME} --delete",这不是有效的AWS CLI命令.

通常,您可以在CMD中将参数传递给aws,但由于您要替换环境变量,因此需要运行一个shell 程序.您可以通过丢弃CMD并完全覆盖入口点来做到这一点:

ENTRYPOINT sh -c "aws s3 sync /build s3://${BUCKET_NAME} --delete"

Reactjs相关问答推荐

如何使用React防止并发注册并处理Firestore数据库中的插槽可用性

Shadck/ui Select -当用户 Select 项目时更改状态

Tailwind不使用@apply classes构建,并强制使用类似于移动的viewport

使用Reaction-Hook-Form时未激发React.js onBlur事件

是否在Extra Reducer完成作业(job)时触发createListenerMiddleware?

如何使ionic 面包屑在州政府条件下可点击?

标签文本删除了 MUI 概述的输入

如何更改TimePicker中下拉菜单的背景 colored颜色 和字体 colored颜色 - MUI React

在MongoDB中,如何获取最后N条记录中字段不为空或不为空字符串的数据

useState数组不更新

AWS 全栈应用程序部署教程构建失败

单元测试 useLoaderData() react-router v6 加载器函数

无法在 reactJS 中使用空包装器 <>

从其他组件切换 FieldSet

React - 仅在变量为真时显示项目

react 测试显示错误的结果

如何使用 cypress 获取 MUI TextField 的输入值?

如何将 id 从页面传递到另一个页面?

链接的音译 Gatsby JS

错误未捕获的错误:[App] 不是 组件. 的所有子组件必须是