Docker 未按预期使用 EC2 ECR 构建映像
Docker not building image as expected with EC2 ECR
我是第一次使用 Docker,现在 运行 遇到一个问题,我认为我的主要问题是我不确定 来源的问题。我正在 运行在 AWS 上安装一个 EC2 实例,该实例已正确配置等以托管网站。
如果我的 git 存储库有更新,我可以手动 ssh 进入 git 存储库,运行
git pull
sudo docker-compose down -v --remove-orphans
sudo docker-compose -f docker-compose.prod.yml up -d --build
这很有魅力。
但是,我一直在开发一个包含 GitHub 操作的管道,我几乎将被推送到 Docker 图像中的代码容器化,将其推送到 ECR 私有repo,然后通过 sshing 进入 EC2 实例,拉取我刚刚推送的新镜像,分解旧镜像,然后(嗯,这就是问题所在),用新镜像重新启动。
我已经调试了一堆,我相当确定推送到我的 ECR 私有存储库的图像是正确的,而且我确定它在 EC2 instance/I 上可以访问它。
我的 Docker 文件的相关部分是:
- 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'
我认为问题实际上可能在于我的 Docker 文件本身:
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 图像。由于您将其推送到 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
希望对您有所帮助。干杯!!!
为遇到类似问题的任何其他人更新,我最终通过将 docker 文件中的“ENTRYPOINT”行替换为以下行来解决此问题:CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000"]
我还删除了:
volumes:
- ..:/code
来自 docker-compose 文件 + 更改为使用图像,就像接受的答案提到的那样。玩了很多东西(我猜这在开发操作中很典型)所以不确定 确切地 是什么导致了问题,但我最终的 docker 撰写文件最终看起来像这样:
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
希望这对以后的人有所帮助!
我是第一次使用 Docker,现在 运行 遇到一个问题,我认为我的主要问题是我不确定 来源的问题。我正在 运行在 AWS 上安装一个 EC2 实例,该实例已正确配置等以托管网站。
如果我的 git 存储库有更新,我可以手动 ssh 进入 git 存储库,运行
git pull
sudo docker-compose down -v --remove-orphans
sudo docker-compose -f docker-compose.prod.yml up -d --build
这很有魅力。
但是,我一直在开发一个包含 GitHub 操作的管道,我几乎将被推送到 Docker 图像中的代码容器化,将其推送到 ECR 私有repo,然后通过 sshing 进入 EC2 实例,拉取我刚刚推送的新镜像,分解旧镜像,然后(嗯,这就是问题所在),用新镜像重新启动。
我已经调试了一堆,我相当确定推送到我的 ECR 私有存储库的图像是正确的,而且我确定它在 EC2 instance/I 上可以访问它。
我的 Docker 文件的相关部分是:
- 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'
我认为问题实际上可能在于我的 Docker 文件本身:
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 图像。由于您将其推送到 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
希望对您有所帮助。干杯!!!
为遇到类似问题的任何其他人更新,我最终通过将 docker 文件中的“ENTRYPOINT”行替换为以下行来解决此问题:CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000"]
我还删除了:
volumes:
- ..:/code
来自 docker-compose 文件 + 更改为使用图像,就像接受的答案提到的那样。玩了很多东西(我猜这在开发操作中很典型)所以不确定 确切地 是什么导致了问题,但我最终的 docker 撰写文件最终看起来像这样:
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
希望这对以后的人有所帮助!