如何移除已存在的Docker容器/镜像GitLab CI?

7

我有一个包括3个步骤的GitLab CI流水线:

  • build
  • release
  • deploy

在我的deploy步骤中,我会通过SSH进入我的DO服务器,登录到GitLab注册表,拉取最新的Docker镜像并运行它。我还尝试使用以下命令来删除现有的容器/镜像:

docker rm -f $(docker ps -aq)
docker rmi $(docker images -q)

.gitlab.yml

cache:
  key: "${CI_COMMIT_REF_NAME} node:latest"
  paths:
    - node_modules/

stages:
  - build
  - release
  - deploy

build:
  ...

release:
  ...

deploy:
  stage: deploy
  image: gitlab/dind:latest
  only:
    - master
  environment: production
  when: manual
  before_script:
    - mkdir -p ~/.ssh
    - echo "${DEPLOY_SERVER_PRIVATE_KEY}" | tr -d '\r' > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - eval "$(ssh-agent -s)"
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H ${DEPLOYMENT_SERVER_IP} >> ~/.ssh/known_hosts
  script:
    - ssh root@${DEPLOYMENT_SERVER_IP}
      "echo 'CONTAINERS';
      docker ps -aq;
      echo 'IMAGES';
      docker images -q;
      docker rm -f $(docker ps -aq);
      docker rmi $(docker images -q);
      docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY};
      docker pull ${CI_REGISTRY}/${CI_PROJECT_PATH}:latest;
      docker run -d ${CI_REGISTRY}/${CI_PROJECT_PATH}:latest;"

在我尝试删除容器/镜像之前,我会记录它们的ID。该构建步骤的(部分)输出如下所示: enter image description here 您可以看到docker ps -aq命令记录了1个现有容器ID,而docker images -q记录了4个现有镜像ID。那么为什么我还会收到以下错误:

"docker rm"需要至少一个参数

...和...

"docker rmi"需要至少一个参数

当我能看到存在容器/镜像时?
4个回答

4

看起来与子shell有关,但如果在gitlib中存在子shell问题,您可以尝试使用xargs

      echo 'IMAGES';
      docker images -q;
      docker ps -aq | xargs docker rm -f;
      docker images -q | xargs docker rmi;

2

这是一个不错的解决方案,但 prune 只会删除已停止的容器,在部署时,我的先前容器仍在运行。 - wmash

2
你正在以不同的方式传递所有图像和容器ID到docker rm命令中。尝试按照以下方式修改脚本。
echo 'IMAGES'; 
docker images -q; 
for container in $(docker ps -aq); 
do 
      docker rm -f $container
done

for image in $(docker images -q);
do
      docker rmi $image
done

如果您仍然面临问题,请告诉我们。


0
这是一个移除所有列出的图片,只保留最新一张的脚本。
images=()
images+=($(docker images europe-west1-docker.pkg.dev/*/*/*:* -q))
images+=($(docker images trion/ng-cli-karma -q | tail -n +2))
images+=($(docker images aquasec/trivy -q | tail -n +2))
images+=($(docker images bridgecrew/checkov -q | tail -n +2))
if [[ ${images[@]} ]]; then
  echo "removing old images : ${images[@]}"
  docker image rm -f ${images[@]}
else
  echo "no images to remove"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接