Docker 容器在本地工作,但在上传到 elasticbeanstalk 时不工作

Posted

技术标签:

【中文标题】Docker 容器在本地工作,但在上传到 elasticbeanstalk 时不工作【英文标题】:Docker container works locally but not when uploaded to elasticbeanstalk 【发布时间】:2020-12-24 11:47:05 【问题描述】:

我的 docker 容器在本地工作,我正在尝试使用 travis 将它部署在弹性 beanstalk 上。 我的 travis 构建成功。 docker 容器已经在本地进行了测试,并且可以正常工作。在 AWS Elastic Beanstalk 上,我的构建目录出现“不是文件/目录错误”。

Dockerfile

FROM node:alpine as builder

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . .

CMD ["npm", "run", "build"]

#Run Phase
FROM nginx 
EXPOSE 80
COPY --from=builder /app/build /usr/share/nginx/html

Dockerfile.dev

FROM node:alpine

WORKDIR '/app'

COPY package.json .
RUN npm install 

COPY . .

CMD ["npm", "run", "start"]

travis.yml

sudo: required
services:
    - docker

before_install:
    - docker build -t *******/docker -f Dockerfile.dev .
script:
    - docker run -e CI=true *******/docker npm run test -- --coverage

deploy:
    provider: elasticbeanstalk
    region: "ap-south-1"
    app: "docker"
    env: "Docker-env-2"
    bucket_name: "***********************"
    bucket_path: "docker"
    on:
        branch: master
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key: $AWS_SECRET_KEY

以下是日志-

Travis output

Elastic Beanstalk output

任何帮助将不胜感激,谢谢!

要在本地运行它,我运行以下命令-

1) docker build -t *******/docker .
2) docker run -it <port>:80 <container_id>

它按预期工作,我可以访问本地主机上的服务器:。 我也在 travis.yml 文件中添加了相同的命令。

有两个 dockerfile,因为我只需要生产容器中的“build”目录,我可以忽略其余目录以节省空间。

【问题讨论】:

应用程序在两种环境下的表现有何不同;这两个图像附件有何不同,生成它们的代码是什么? (如果它们是日志文件,请编辑问题以包含实际文本,而不是图像,而不是作为附件或链接。)为什么有两个单独的 Dockerfile?当你说“它在本地工作”时,你如何构建和运行它? 感谢您抽出宝贵时间回复,我会一一回答您的问题,该应用程序在两种环境中都没有做任何不同的事情。每当我将代码推送到主分支时,我正在使用链接到我的 github 存储库的 travis-ci 来拉取、运行测试并部署到 AWS。这些本身不是日志文件,它们基本上是 AWS 和作业日志中的“事件历史记录”(作为 travis-ci.org 上的 UI 的一部分)。我没有足够的声誉来嵌入,所以我不得不将它作为链接附加。有两个独立的 docker 文件,其中一个用于开发,另一个用于生产。 好吧,我还没有做任何反应,我运行了 create-react-app 命令来生成一个示例应用程序并使用 travis-ci 将其部署在 AWS 上(课程讲师教过这个)。我意识到我的项目根文件夹中已经有一个构建目录,它是使用“create-react-app”命令创建的。此构建目录不在正在运行的容器中,这就是复制失败的原因。 好吧,我很愚蠢。我假设运行 react-app build 命令时会自动生成构建目录,而且构建目录位于 .gitignore 文件中,因此 Travis 无法访问它。我现在解决了,还是谢谢你的帮助! 您应该考虑为自己的问题发布一个答案,并为以后遇到类似问题的任何人而接受它。 【参考方案1】:

我意识到构建目录列在 .gitignore 文件中,从而阻止了 travis-ci 访问它,因为它不在 repo 中。 一旦我删除它并重新部署它,就可以完美地工作。

【讨论】:

以上是关于Docker 容器在本地工作,但在上传到 elasticbeanstalk 时不工作的主要内容,如果未能解决你的问题,请参考以下文章

Linux之shell脚本实战批量上传docker镜像到华为云容器镜像仓库

Docker 容器中的 Nginx 出现“连接重置”错误,但在没有容器的情况下工作正常

docker上传保存本地镜像

docker—搭建本地私有仓库

docker—搭建本地私有仓库

docker将镜像导出到本地,上传至内网服务器上