将 react 应用的 docker 镜像部署到 Elastic beanstalk

Posted

技术标签:

【中文标题】将 react 应用的 docker 镜像部署到 Elastic beanstalk【英文标题】:Deploy docker image of react app to Elastic beanstalk 【发布时间】:2021-08-25 00:23:51 【问题描述】:

我正在尝试使用 docker 将我的 create-react-app 部署到弹性豆茎 我已经使用 codebuild 和弹性 beanstalk 设置了 codepipeline。

我收到了这个错误

Stop running the command. Error: Dockerfile and Dockerrun.aws.json are both missing, abort deployment 

我的 Dockerfile 看起来像这样

FROM tiangolo/node-frontend:10 as build-stage  
# Create app directory  
# RUN mkdir -p /usr/src/app  
# WORKDIR /usr/src/app  
  
WORKDIR /app  
  
  
# # fix npm private module  
# ARG NPM_TOKEN  
# COPY .npmrc /app/  
#COPY package.json package.json  
  
COPY package*.json /app/ 
COPY Dockerrun.aws.json /app/  
RUN npm install  
COPY ./ /app/  
# RUN CI=true npm test  
RUN npm run build  
  
# FROM nginx:1.15  
FROM nginx:1.13.3-alpine   
  
# Install app dependencies  
  
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx  
COPY --from=build-stage /app/build/ /usr/share/nginx/html  
# Copy the default nginx.conf provided by tiangolo/node-frontend  
COPY --from=build-stage /nginx.conf /etc/nginx/conf.d/default.conf  
  
RUN ls   
EXPOSE 80  

我也有一个 Dockerrun.aws.json


  "AWSEBDockerrunVersion": "3",
  "Image": 
    "Name": "something.dkr.ecr.us-east-2.amazonaws.com/subscribili:latest",
    "Update": "true"
  ,
  "Ports": [
    
      "ContainerPort": "5000"
    
  ],
  "Logging": "/var/log/nginx"

我的 buildspec.yml 文件如下所示

version: 0.2
phases:
  pre_build:
    commands:
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=something.dkr.ecr.us-east-2.amazonaws.com/subscribili
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=$COMMIT_HASH:=latest
  build:
    commands:
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - printf '["name":"nginx","imageUri":"%s"]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
  files: imagedefinitions.json

我确定 buildspec 文件存在一些问题,但我不确定是什么问题。

我已经阅读了所有文档,仍然无法弄清楚如何编写构建规范文件 Docker。 我有什么遗漏吗?

【问题讨论】:

你只有一个神器imagedefinitions.json?那么其他所有内容,即错误消息中的文件呢? @Marcin 那里需要什么? Dockerfile 和 Dockerrun.aws.json 这两个文件需要位于运行命令“COPY Dockerrun.aws.json /app/”的同一目录中。 【参考方案1】:

Dockerfile 和 Dockerrun.aws.json 这两个文件需要位于运行命令“COPY Dockerrun.aws.json /app/”的同一目录中。确保这些文件存在于该目录中,此错误应该消失

【讨论】:

这些文件存在。让我添加我的文件夹结构的屏幕截图。 我认为“Dockerrun.aws.json”文件只允许在 zip 中。你能试试吗?您也可以查看这篇文章:***.com/questions/57648966/… 也许这会有所帮助 如何在 zip 中添加它?我没有在任何地方压缩它我必须吗?如果是的话,我需要压缩什么我已经创建了一个 docker 映像并将其推送到 ecr 存储库,所以我希望弹性 beanstalk 会从那里挑选它。【参考方案2】:

“eb deploy”命令从您的代码创建一个 zip 文件。但是,为了使其尽可能小,它只需要提交到 git 的文件。所以,如果你没有提交 Dockerfile 和 Dockerrun 文件,这两个文件将不会包含在 zip 中。

如果您不希望它像这样运行,您可以将 .ebignore 文件添加到您的项目根目录。此文件命令与 gitignore 文件相同;您可以复制从 gitignore 到 ebignore 的所有内容。如果有 .ebignore,cli 将不会检查项目是否已提交到源代码管理。

现在要检查 zip 文件中包含的内容,请在“eb deploy”命令之后查看 .elasticbeanstalk 文件夹。准备好 zip 后,立即将其复制并粘贴到另一个文件夹。注意:cli上传后,原始zip文件将被删除。

【讨论】:

以上是关于将 react 应用的 docker 镜像部署到 Elastic beanstalk的主要内容,如果未能解决你的问题,请参考以下文章

docker部署springboot

Docker

Docker技术这些应用场景,你知道吗?

使用docker部署一个go应用

使用docker部署一个go应用

AWS Beanstalk 无法部署 Docker Node(React) 应用程序