docker - 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
我怎样才能做到这一点?
解决方案
对于有类似问题的其他人的更新,我最终通过将 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
希望这对将来的某人有所帮助!
推荐阅读
- r - 用于每日数据预测的 auto.arima 日期太远了
- python-3.x - 从 jupyter notebook 中的 pandas 数据框中选择单行时出现 Python Key 错误
- python - 如何从列表创建 DataFrame,以便列表显示为一列而不是单行?
- python - 优化裁剪功能
- c# - 切换日夜主题 Android Xamarin
- python - Python:Netcdf:是否有一种方法可以从一个变量中获得总体平均值,而另一个变量与唯一值重叠?
- java - 在 Android Studio 中为每个方向设置不同的约束
- discord.js - Discord.JS 试图向用户发送消息
- cypher - 在 Gremlin 中围绕具有传出和传入边的单个节点创建子图查询
- javascript - 保存会话的电子 GET 请求