当我使用一些
docker-compose
从 volumes
创建一个容器,然后提交该容器时,docker-compose 文件中的 volumes
也将被提交。有没有办法不提交图像中的卷?
使用以下命令只能添加音量但不能删除它们:
docker commit -c 'VOLUME /foo' container_name image_name
谢谢你。
更新(2018 年 4 月):在“如何编辑现有的 docker 镜像元数据?”中,Guido U. Draheim 提出了
gdraheim/docker-copyedit
,一个可以编辑 docker 镜像元数据的 python 脚本。
可以删除或覆盖图像元数据,包括卷。
命令是:
./docker-copyedit.py FROM image1 INTO image2 REMOVE ALL VOLUMES
自 2018 年以来,同一期现在包括(来自 Aalex Gabi):
为了构建带有嵌入式 MySQL 数据库快照的 CI 映像,我最终使用了以下解决方案:“使用
在 Docker 映像中保留并共享开发数据”,来自 Steven Landow。commit
FROM mysql:5.7
ADD snapshots/default.sql /tmp/default.sql
# Using separate data folder outside of mysql image declared volume
# https://github.com/moby/moby/issues/3465
# https://medium.com/@stevenlandow/persist-share-dev-mysql-data-in-a-docker-image-with-commit-f9aa9910be0a
RUN mkdir /var/lib/mysql-no-volume
RUN set -exu ;\
MYSQL_ROOT_PASSWORD=root docker-entrypoint.sh --datadir /var/lib/mysql-no-volume &\
MYSQL_PID=$! &&\
timeout 22 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' localhost 3306 &&\
mysql -proot -e 'create database `mydb` collate "utf8mb4_general_ci"' &&\
mysql -proot mydb < /tmp/default.sql &&\
kill $MYSQL_PID &&\
tail --pid=$MYSQL_PID -f /dev/null # Using tail to wait for PID to end https://unix.stackexchange.com/questions/427115/listen-for-exit-of-process-given-pid
# Using separate data folder outside of mysql image declared volume
# https://github.com/moby/moby/issues/3465
# https://medium.com/@stevenlandow/persist-share-dev-mysql-data-in-a-docker-image-with-commit-f9aa9910be0a
CMD ["--datadir", "/var/lib/mysql-no-volume"]
目前看来这是不可能的,尽管有很多人请求该功能并且可能有人正在开发它。这个 Github 问题讨论了这个主题:
这有点激进,但允许某人从头开始重新定义一切,正如解决方法所暗示的那样。
FROM <your image full of unwanted settings> as source
FROM scratch
COPY --from=source / /
这将删除所有内容,您将不得不再次公开环境、端口、卷、入口点、命令以及您想要公开的任何内容。