docker-compose build 不会重新创建我的容器的某些切片,导致部分代码过时
docker-compose build doesn't re-create some slices of my container, resulting in partially obsolete code
我有一个 Django-Angular 网络项目(称为工作流),它是我用 Jenkins CI 构建的。 Jenkins 监控存储库,并在新提交时使用以下 2 个执行清理和重新构建的脚本重新构建我项目的容器:
#!/bin/sh
docker rm -v $(docker ps -a -q -f status=exited) 2>/dev/null
docker rmi $(docker images -q -f 'dangling=true') 2>/dev/null
exit 0
重建脚本是:
!/bin/sh
DOCKER_COMPOSE=/usr/local/bin/docker-compose
[ -x $DOCKER_COMPOSE ] || (
echo "docker-compose not found, install it from https://docs.docker.com/compose/install/"
exit 1
)
$DOCKER_COMPOSE build --pull || exit 1
$DOCKER_COMPOSE up -d || exit 2
$DOCKER_COMPOSE ps
我在 Dockerfile
指令中的 Docker 图像中构建 javascript 我的 django 站点的前端,如下所示:
FROM debian:jessie
ADD . /srv/workflows
# Install dependencies
RUN apt-get update && apt-get install -y git \
curl \
uwsgi \
uwsgi-plugin-python \
python-django \
python-psycopg2 \
python-django-celery \
python-django-jsonfield
RUN easy_install pip
RUN pip install djangorestframework \
python-social-auth
RUN pip install git+https://github.com/st4lk/django-rest-social-auth.git
# Set up node.js and build frontend
RUN curl --silent --location https://deb.nodesource.com/setup_5.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g webpack gulp-cli bower
WORKDIR /srv/workflows/workflows/frontend
RUN npm install
RUN bower install --allow-root
RUN mkdir -p ../static
RUN mkdir -p ../../static
RUN gulp dist
# Get everything ready and run
WORKDIR /srv/workflows
RUN python manage.py validate
RUN python manage.py collectstatic --clear --noinput
CMD /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
但是由于某些原因,当 docker-compose
重建此图像时,django collectatic 命令 (python manage.py collectstatic --clear --noinput
) 的结果仍然包含第一个图像中包含的文件的第一个古代版本,当我首先从中创建了容器。为什么?
docker-compose.yml
的相关部分:
workflows-django:
restart: always
build: ./workflows
links:
- "workflows-db: workflows-db"
- "workflows-rabbitmq: workflows-rabbitmq"
volumes:
- /srv/workflows/static/
volumes_from:
- workflows-db
ports:
- "8000:8000"
command: /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
(正如我们在评论中讨论的那样)
使用卷时 Compose preserves volumes on container recreate。
即使你重建镜像,如果它定义了相同的卷,它也会继续被使用。一般来说,我建议不要将源代码(或本例中的资产)放入卷中。卷用于 运行 时间状态,但资产和源代码应随图像变化,而不是在 运行 秒之间保留。
如果您想继续使用卷,您可以 运行 docker-compose rm
删除旧容器,这将删除对卷的引用。
我有一个 Django-Angular 网络项目(称为工作流),它是我用 Jenkins CI 构建的。 Jenkins 监控存储库,并在新提交时使用以下 2 个执行清理和重新构建的脚本重新构建我项目的容器:
#!/bin/sh
docker rm -v $(docker ps -a -q -f status=exited) 2>/dev/null
docker rmi $(docker images -q -f 'dangling=true') 2>/dev/null
exit 0
重建脚本是:
!/bin/sh
DOCKER_COMPOSE=/usr/local/bin/docker-compose
[ -x $DOCKER_COMPOSE ] || (
echo "docker-compose not found, install it from https://docs.docker.com/compose/install/"
exit 1
)
$DOCKER_COMPOSE build --pull || exit 1
$DOCKER_COMPOSE up -d || exit 2
$DOCKER_COMPOSE ps
我在 Dockerfile
指令中的 Docker 图像中构建 javascript 我的 django 站点的前端,如下所示:
FROM debian:jessie
ADD . /srv/workflows
# Install dependencies
RUN apt-get update && apt-get install -y git \
curl \
uwsgi \
uwsgi-plugin-python \
python-django \
python-psycopg2 \
python-django-celery \
python-django-jsonfield
RUN easy_install pip
RUN pip install djangorestframework \
python-social-auth
RUN pip install git+https://github.com/st4lk/django-rest-social-auth.git
# Set up node.js and build frontend
RUN curl --silent --location https://deb.nodesource.com/setup_5.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g webpack gulp-cli bower
WORKDIR /srv/workflows/workflows/frontend
RUN npm install
RUN bower install --allow-root
RUN mkdir -p ../static
RUN mkdir -p ../../static
RUN gulp dist
# Get everything ready and run
WORKDIR /srv/workflows
RUN python manage.py validate
RUN python manage.py collectstatic --clear --noinput
CMD /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
但是由于某些原因,当 docker-compose
重建此图像时,django collectatic 命令 (python manage.py collectstatic --clear --noinput
) 的结果仍然包含第一个图像中包含的文件的第一个古代版本,当我首先从中创建了容器。为什么?
docker-compose.yml
的相关部分:
workflows-django:
restart: always
build: ./workflows
links:
- "workflows-db: workflows-db"
- "workflows-rabbitmq: workflows-rabbitmq"
volumes:
- /srv/workflows/static/
volumes_from:
- workflows-db
ports:
- "8000:8000"
command: /bin/bash -c "python manage.py makemigrations --noinput; python manage.py migrate --noinput; /usr/bin/uwsgi --emperor /etc/uwsgi/apps-enabled/bostongene.ini"
(正如我们在评论中讨论的那样)
使用卷时 Compose preserves volumes on container recreate。
即使你重建镜像,如果它定义了相同的卷,它也会继续被使用。一般来说,我建议不要将源代码(或本例中的资产)放入卷中。卷用于 运行 时间状态,但资产和源代码应随图像变化,而不是在 运行 秒之间保留。
如果您想继续使用卷,您可以 运行 docker-compose rm
删除旧容器,这将删除对卷的引用。