Resposta de erro do Docker do daemon: "Conflito ... já está sendo usado pelo contêiner"

135

Estou usando o Docker no meu PC para executar o Quantum GIS com as seguintes instruções que encontrei aqui: docker-qgis-desktop - Um contêiner simples do docker que executa o QGIS desktop

Tudo estava funcionando bem até a semana passada, quando comecei a receber esta mensagem de erro:

Error response from daemon: Conflict. 
The name "qgis-desktop-2-4" is already in use by container 235566ae17b8. 
You have to delete (or rename) that container to be able to reuse that name.

Não tenho muita certeza do que isso significa, apesar de procurar pistas neste site. Eu não havia mudado nada antes disso e estava iniciando com êxito o contêiner com este comando:

sudo docker run --rm --name="qgis-desktop-2-4"     -i -t     -v ${HOME}:/home/${USER}     -v /tmp/.X11-unix:/tmp/.X11-unix     -e DISPLAY=unix$DISPLAY     kartoza/qgis-desktop:latest

Como posso consertar isso?

marty_c
fonte

Respostas:

217

Parece que um contêiner com o nome qgis-desktop-2-4já existe no sistema. Você pode verificar a saída do comando abaixo para confirmar se ele realmente existe:

$ docker ps -a

A última coluna na saída do comando acima é para nomes.

Se o contêiner existir, remova-o usando:

$ docker rm qgis-desktop-2-4

Ou usando com força,

$ docker rm -f qgis-desktop-2-4

E tente criar um novo contêiner.

Dharmit
fonte
hey @Dharmit obrigado pelo comentário. Eu tentei isso, mas agora recebo a seguinte mensagem de errogroupadd: GID '0' already exists useradd: user 'root' already exists No protocol specified Warning: qgis.bin: cannot connect to X server unix:0.0
marty_c
Parece que a imagem tenta fazer com que o usuário seja root e um grupo raiz que ambos já existam. O Docker usa root: root como usuário e grupo padrão. Mas o primeiro problema foi corrigido quando você removeu o primeiro contêiner.
luxas
hmm, estranho, então por que estava funcionando bem no começo, isto é, de 3 a 4 meses? Alguma idéia do que eu posso fazer para corrigir isso ?!
Marty_c
1
Como podemos simplesmente reiniciar o contêiner existente em vez de matar o antigo e invocar o mesmo nome novamente?
Dhanesh Mane
13
@DhaneshMane docker restart, ou docker stop& docker startdeve ajudá-lo.
Dharmit 18/10
34

Em vez de comando: docker run

Você deveria usar:

docker start **CONTAINER ID**

porque o contêiner já existe

Mais informações

nasir taha
fonte
1
'docker start' não oferece opções para ativar a rede host, montar volumes a partir da linha de comando e outras opções necessárias no meu caso. Então, pessoalmente, tive que excluir (podar) e depois executar.
HH- Peça desculpas a Carole Baskin em
1
@horsehair quando eu uso o docker start <myContainerName>, ele restabelece todas as portas expostas e montagens de volume. Portanto, dependendo de como você executou seu contêiner inicialmente, essas configurações devem ser resolvidas com o docker start.
djchapm
Sim, isso é péssimo, porque eu quero que funcione nos dois sentidos ... iniciar / executar para desenvolvedores que se juntam à equipe e para desenvolvedores que a executaram antes. não é muito idempotente :(. oh bem, acho que tenho que fazer alguma lógica nos scripts do bash
Dean Hiller
9

Recebi muito esse erro, agora faço uma remoção em lote de todos os contêineres não utilizados de uma só vez:

docker container prune 

adicione -fpara forçar a remoção sem aviso prévio.

Para listar todos os contêineres não utilizados (sem remoção):

docker container ls -a --filter status=exited --filter status=created 

Veja aqui mais exemplos de como remover outros objetos (redes, volumes, etc.).

Noam Manos
fonte
8

Para pessoas que chegam aqui do google como eu e só querem criar contêineres usando vários arquivos de composição de encaixe com um serviço compartilhado:

Às vezes, você tem projetos diferentes que compartilhariam, por exemplo, um contêiner do docker de banco de dados. Somente a primeira execução deve iniciar o DB-Docker, a segunda deve detectar que o banco de dados já está em execução e pular isso. Para alcançar esse comportamento, precisamos que os Dockers fiquem na mesma rede e no mesmo projeto . Além disso, o nome do contêiner do docker precisa ser o mesmo.

1º: defina o mesmo nome de rede e contêiner no docker-compose

docker-compor no projeto 1:

version: '3'

services:
    service1:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

docker-compor no projeto 2:

version: '3'

services:
    service2:
        depends_on:
            - postgres
        # ...
        networks:
            - dockernet

    postgres:
        container_name: project_postgres
        image: postgres:10-alpine
        restart: always
        # ...
        networks:
            - dockernet

networks:
    dockernet:

2º: defina o mesmo projeto usando -p param ou coloque os dois arquivos no mesmo diretório.

docker-compose -p {projectname} up

Karl Adler
fonte