1
resposta

Erro ao executar Docker Compose

quando dou o docker compose docker compose up --build acontece o localhost:8080 nao fica disponivel para mim e aparece as seguintes mensagens no meu terminal

postgres-1  | 
postgres-1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1  | 
postgres-1  | 2024-11-01 20:41:39.229 UTC [1] LOG:  starting PostgreSQL 17.0 (Debian 17.0-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
postgres-1  | 2024-11-01 20:41:39.229 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres-1  | 2024-11-01 20:41:39.229 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres-1  | 2024-11-01 20:41:39.231 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-1  | 2024-11-01 20:41:39.235 UTC [29] LOG:  database system was shut down at 2024-11-01 20:28:35 UTC
postgres-1  | 2024-11-01 20:41:39.240 UTC [1] LOG:  database system is ready to accept connections
app-1       | main.go is a directory, should be a Go file
app-1 exited with code 1
docker-compose.yml

services:
  postgres:
    image: "postgres"
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=root
    ports:
      - 5432:5432
    volumes:
      - ./postgres-data:/var/lib/postgresql/data

  app:
    build: .
    ports:
        - 8080:8080
    depends_on:
        - postgres
    environment:
      - DB_HOST=postgres
      - DB_USER=root
      - DB_PASSWORD=root
      - DB_NAME=root
      - DB_PORT=5432
Dockerfile

FROM golang:1.22
EXPOSE 8080
WORKDIR /app

COPY ./assets/ /app/assets/
COPY ./controllers/ /app/controllers/
COPY ./database/ /app/database/
COPY ./models/ /app/models/
COPY ./routes/ /app/routes/
COPY ./templates/ /app/templates/
COPY ./main.go /app/main.go/
COPY ./go.mod /app/go.mod/
COPY ./go.sum /app/go.sum/

CMD [ "go", "run", "main.go" ]
1 resposta

Opa Renan, tudo bem?

O problema está ocorrendo por conta das "/" após as extensões dos arquivos. Apenas remover a "/" no final dos três últimos COPYs, já resolverá o problema.

Explicação do Comportamento

Quando utilizamos "/" no final, estamos dizendo que aquele objeto é um diretório.

Mas... Por que o Docker Compose não impediu isso (ou o próprio docker), gerando um erro na etapa de construção da imagem (build)?

Isso é porque esse comportamento é uma facilitação na forma como o Docker trabalha com o COPY.

Se você executar o seguinte comando docker run -it --rm <nome-da-imagem> sh, e digitar o comando ls -l, irá ter um resultado parecido com o abaixo:

# ls -l
drwxr-xr-x 2 root root 4096 Nov  2 05:25 go.mod
drwxr-xr-x 2 root root 4096 Nov  2 05:25 main.go

Perceba o d na frente do rwx. Ele indica que aquele objeto é um diretório. Se você entrar dentro do diretório main.go/, e executar novamente o comando para listagem de diretório, você terá o seguinte resultado:

# ls -l
total 4
-rw-r--r-- 1 root root 105 Nov  2 05:22 main.go

O que podemos entender com isso?

O que o docker faz é pegar o arquivo ao qual você está definindo no COPY, e colocar dentro do diretório definido como destino, que nesse caso foi o /app/main.go/, caso o destino seja um diretório (termine com "/").

Esse comportamento é o que permite algo como COPY main.go . ou COPY . . funcionarem como o esperado.

Quando precisa dessa exatidão de localização do arquivo, e do diretório, você pode seguir a seguinte regra:

# Para diretório
COPY <diretorio> <diretorio> 

# Para arquivos
COPY <arquivo> <arquivo> 

Espero ter ajudado!