首页 > 解决方案 > Docker 未按预期使用 EC2 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

这就像一个魅力。

但是,我一直在使用 GitHub 操作开发管道,并且我几乎将推送到 Docker 映像中的代码容器化,将其推送到 ECR 私有存储库,然后 ssh 进入 EC2 实例,拉取新的我刚刚推送的图像,分解了旧图像,并且(嗯,这就是问题所在),使用新图像重新启动。

我已经调试了一堆,并且我相当确定推送到我的 ECR 私有仓库的图像是正确的,并且我确定它在 EC2 实例上/我可以访问它。

我的 Dockerfile 的相关部分是:

- name: Permission for ecr 
        run: ssh staging 'aws ecr get-login-password --region us-east-1 | sudo docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_REGISTRY }}'
      - name: Pull new image
        run: ssh staging 'sudo docker pull ${{ secrets.AWS_ECR_REGISTRY }}/my-repo:latest'
      - name: Stop running container
        run: ssh staging 'cd vms; sudo docker-compose down -v --remove-orphans'
      - name: Start new container
        run: ssh staging 'cd vms; 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 文件:

version: "3.8"
services:
  web:
    build: 
      context: ..
      dockerfile: ./docker/Dockerfile.prod
    command: gunicorn vms.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ..:/code
    expose:
      - 8000
  nginx:
    build: ../nginx
    ports:
      - 1337:80
    depends_on: 
      - web

我怎样才能做到这一点?

标签: dockeramazon-ec2docker-composedockerfileamazon-ecr

解决方案


对于有类似问题的其他人的更新,我最终通过将 dockerfile 中的“ENTRYPOINT”行替换为以下行来解决此问题:CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000"] 并且我还删除了:

volumes:
  - ..:/code

从 docker-compose 文件+更改为使用图像,就像接受的答案提到的那样。玩了很多东西(我猜这在开发操作中很典型)所以不确定到底是什么导致了问题,但我最终的 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

希望这对将来的某人有所帮助!


推荐阅读