Docker未使用EC2 ECR按预期构建图像

Docker未使用EC2 ECR按预期构建图像,docker,amazon-ec2,docker-compose,dockerfile,amazon-ecr,Docker,Amazon Ec2,Docker Compose,Dockerfile,Amazon Ecr,我第一次使用Docker,遇到了一个问题,我认为我的主要问题是我不确定问题的来源。我正在AWS上运行一个EC2实例,该实例已正确配置,以承载一个站点 如果我对git-repo有更新,我可以手动ssh到git-repo中,运行 git pull sudo docker-compose down -v --remove-orphans sudo docker-compose -f docker-compose.prod.yml up -d --build 这就像一个符咒 然而,我一直在使用GitH

我第一次使用Docker,遇到了一个问题,我认为我的主要问题是我不确定问题的来源。我正在AWS上运行一个EC2实例,该实例已正确配置,以承载一个站点

如果我对git-repo有更新,我可以手动ssh到git-repo中,运行

git pull
sudo docker-compose down -v --remove-orphans
sudo docker-compose -f docker-compose.prod.yml up -d --build
这就像一个符咒

然而,我一直在使用GitHub操作开发一个管道,我正在将推送到Docker映像中的代码进行容器化,将其推送到ECR私有回购,然后将其推送到EC2实例中,拉出我刚刚推送的新映像,分解旧映像,并且(好吧,问题就在这里),使用新映像重新启动

我已经调试了一组,我相当确定推送到我的ECR私有回购的映像是正确的,并且我确定它在EC2实例上/我有权访问它

我的Dockerfile的相关部分是:

-名称:ecr的权限
运行:ssh staging'aws ecr get login password--region us-east-1 | sudo docker login--username aws--password stdin${{secrets.aws_ecr_REGISTRY}
-名称:拉新图像
运行:ssh staging'sudo docker pull${{secrets.AWS_ECR_REGISTRY}}/my repo:latest'
-名称:停止运行容器
运行:ssh暂存“cd虚拟机”;sudo docker compose down-v--删除孤儿'
-名称:启动新容器
运行:ssh暂存“cd虚拟机”;sudo docker compose-f docker-compose.prod.yml up-d--build'
我认为问题实际上可能在于我的Dockerfile本身:

FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/ #line I'm concerned about
EXPOSE 8000
ENTRYPOINT python manage.py collectstatic --noinput && python manage.py runserver 0.0.0.0:8000
因为这样做是将当前目录中的所有内容复制到代码卷中。我认为这可能是一个问题,因为,当然,我可能会将docker映像正确地拉入并推送到服务器,但当我实际运行
sudo docker compose-f docker-compose.prod.yml up-d--build
时,我最好的猜测是当前目录中的所有内容都被容器化并启动了,但我希望我的新形象,我推动启动

编辑:这是docker-compose.prod.yml文件:

版本:“3.8”
服务:
网状物:
建造:
背景:。。
dockerfile:./docker/dockerfile.prod
命令:gunicorn vms.wsgi:application--bind 0.0.0.0:8000
卷数:
-..:/代码
揭露:
- 8000
nginx:
生成:../nginx
端口:
- 1337:80
取决于:
-网

我如何才能做到这一点?

您遇到的问题是,您正在尝试再次构建docker映像。由于您将其推送到ECR,而不是构建它,因此您可以简单地使用构建的映像并立即运行它

改用此
docker compose.prod.yml
文件:

版本:“3.8”
服务:
网状物:
图片:
命令:gunicorn vms.wsgi:application--bind 0.0.0.0:8000
nginx:
图片:
端口:
- 1334:80
取决于:
-网
请注意,我已删除了两个应用程序中的
构建
步骤,并将其替换为
图像
。您必须在其中填入正确的值

并使用以下命令替换build命令:

sudo docker compose-f docker-compose.prod.yml up-d

希望这对你有帮助。为有类似问题的其他人干杯更新,我最终解决了这个问题,将dockerfile中的“ENTRYPOINT”行替换为以下行:
CMD[“python”、“manage.py”、“runserver”、“0.0.0.0:8000”]
我还删除了:

volumes:
  - ..:/code
从docker compose file+更改为使用图像,如接受的答案所述。玩了很多东西(我想这是开发人员操作中的典型情况),所以不确定到底是什么导致了问题,但我的最终docker compose文件最终看起来是这样的:

version: "3.8"
services:
  web:
    image: <aws-path>/simple-django:latest
    command: gunicorn vms.wsgi:application --bind 0.0.0.0:8000
    expose:
      - 8000
  nginx:
    build: ../nginx
    ports:
      - 1337:80
    depends_on: 
      - web
版本:“3.8”
服务:
网状物:
图像:/simple django:最新
命令:gunicorn vms.wsgi:application--bind 0.0.0.0:8000
揭露:
- 8000
nginx:
生成:../nginx
端口:
- 1337:80
取决于:
-网

希望这对将来的人有帮助

你能添加
docker-compose-prod.yml
文件吗?刚刚添加的,很抱歉!别担心。我补充了答案。也许这对你来说不太合适。但是你可以知道哪里出了问题。第二个代码块被标记为dockerfile,但它显然不是——你能修复它吗?我不知道我在看什么。嗨,是的,更新一下,我能修好它!结果是,就像下面的答案一样,我不得不使用一个图像来代替,并且我还从docker-compose.prod.yml文件中删除了卷:../:code;另外,我在DockerfileAh中用
CMD[“python”,“manage.py”,“runserver”,“0.0.0.0:8000”]
替换了
ENTRYPOINT python manage.py collectstatic--noinput&&python manage.py run
,非常感谢,这很有意义!一个简单的问题是,我现在有一堆图片,其中我想要构建的图片有“最新”标签。我试过:
image:my repo:latest
但这似乎不起作用——这里有我遗漏的东西吗?你有标签为“latest”的图像吗?您需要使用docker compose文件中使用的相同标记将图像推送到ECR。尝试在您的本地计算机中使用docker pull命令,并检查是否可以使用相同的标记拖动该图像?我猜你没有给它贴标签。啊,是的,好吧,我能弄明白这一点,但是,唉,看来我还是和以前一样有问题!现在,我确实构建了新的映像,因此,例如,如果我有一个id为90d1263c6fb8的映像,并且我指定了
build:image:66f04118ce2e
,这将成功构建,但是,在一天结束时,网站上显示的内容仍然是当前目录中的直接代码,更新:我可能已经找到了问题的根源,我认为它存在于Dockerfile本身——可能稍后会发布后续问题,但无论如何,这个答案都是正确的