【问题标题】:Docker not building image as expected with EC2 ECRDocker 未按预期使用 EC2 ECR 构建映像
【发布时间】:2021-05-16 05:37:25
【问题描述】:

我是第一次使用 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

我该怎么做?

【问题讨论】:

  • 可以添加docker-compose-prod.yml 文件吗?
  • 刚刚添加,抱歉!
  • 不用担心。我添加了答案。也许它可能不适合你开箱即用。但你可以知道出了什么问题。
  • 第二个代码块被标记为一个 dockerfile,但它显然不是——你能解决这个问题吗?我不知道我在看什么。
  • 嗨,是的,对此进行了更新,我能够修复它!结果就像下面的答案一样,我不得不改用图像,并且还从 docker-compose.prod.yml 文件中删除了卷: ../:code ;另外,我在 Dockerfile 中用CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000"] 替换了ENTRYPOINT python manage.py collectstatic --noinput && python manage.py run

标签: docker amazon-ec2 docker-compose dockerfile amazon-ecr


【解决方案1】:

您遇到的问题是您正在尝试再次构建 docker 映像。由于您将其推送到 ECR,因此您无需构建它,只需使用构建的映像并开箱即用即可。

改用这个docker-compose.prod.yml 文件:

version: "3.8"
services:
  web:
    image: <path-to-your-docker-image-in-ecr>
    command: gunicorn vms.wsgi:application --bind 0.0.0.0:8000
  nginx:
    image: <nginx-image-you-need>
    ports:
      - 1334:80
    depends_on: 
      - web

请注意,我已在您的两个应用程序中删除了 build 步骤,并将它们替换为 image。您必须在其中填写正确的值。

并使用以下内容替换构建命令:

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

希望这对您有所帮助。干杯?!!!

【讨论】:

  • 啊,好的,非常感谢,这很有意义! 的一个快速问题,我目前有一堆图像,我想从中构建的图像具有“最新”标签。我试过了:image: my-repo:latest 但这似乎不起作用——我这里有什么遗漏吗?
  • 你有带有“最新”标签的图片吗?您需要使用在 docker-compose 文件中使用的相同标签将图像推送到 ECR。尝试在本地机器上使用 docker pull 命令并检查是否可以使用相同的标签拉取该图像?我猜你没有标记它。
  • 啊,是的,好吧,我能够解决这个问题,但唉,我似乎仍然遇到和以前一样的问题!现在,我确实构建了新图像,因此,例如,如果我有一个 id 为:90d1263c6fb8 的图像,并且我指定了build: image: 66f04118ce2e,这将成功构建,但最终,无论网站上显示什么仍然只是直接从当前目录中的代码中出来,并且似乎与图像完全无关。
  • 更新:我可能已经找到了问题的根源,我认为它在于 Dockerfile 本身——稍后可能会发布一个后续问题,但无论哪种方式,这个答案都是有道理的,谢谢!
  • 很好,对于第一次使用 docker 的人来说,你做得很好。祝你好运!
【解决方案2】:

为遇到类似问题的其他人更新,我最终通过将 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

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

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2020-04-29
    • 2021-12-27
    • 2020-09-27
    相关资源
    最近更新 更多