【发布时间】: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