簡體   English   中英

無法在 Docker 中安裝卷 撰寫正確

[英]Can't mount volume in Docker Compose right

首先,我一步一步地完成了所有這些: https://docs.docker.com/language/golang/develop/完美運行。 然后我開始對我的 golang 項目進行同樣的嘗試。 它不僅需要卷中的 db,還需要 'assets' 和 'creds' 目錄,我能夠提供這些目錄與正常的 Dockerfile 和 'docker run' 命令中的 --mount 標志一起使用。 所以我的架構是:

  • 創建一個卷“蟑螂”。
  • 創建一個用於復制文件夾的臨時容器。
    docker container create --name temp -v roach:/data busybox \
    docker cp assets/ temp:/data \
    docker rm temp
  • 運行我的容器
docker run -it --rm \
  --mount 'type=volume,src=roach,dst=/usr/data' \
  --network mynet \
  --name postgres-server \
  -p 80:8080 \
  -e PGUSER=totoro \
  -e PGPASSWORD=myfriend \
  -e PGHOST=db \
  -e PGPORT=26257 \
  -e PGDATABASE=mydb \
 postgres-server
  • Go 文件可以訪問/usr/data/my_folders

順便說一句,這里是 Dockerfile:

# syntax=docker/dockerfile:1

FROM golang:1.18-buster AS build

WORKDIR /app

COPY go.mod .
RUN go mod download

COPY . .

RUN go mod tidy

RUN go build -o /t main/main.go main/inst_list.go


## Deploy

FROM gcr.io/distroless/base-debian10

ENV GO111MODULE=on
ENV GOOGLE_APPLICATION_CREDENTIALS='/usr/data/credentials/creds.json'

WORKDIR /

COPY --from=build /t /t

EXPOSE 8080

USER root:root


ENTRYPOINT ["/t"]

==================================================== ===============

然后我開始嘗試制作一個 Docker-compose.yml 文件,就像在該示例的末尾一樣。 它沒有 --mount 標志,但我找到了很多方法來指定安裝路徑。 我嘗試了更多,但在下面的代碼中留下了 3 個變體(注釋了 3 個中的 2 個):

version: '3.8'

services:
  docker-t-roach:
    depends_on: 
      - roach
    build:
      context: .
    container_name: postgres-server
    hostname: postgres-server
    networks:
      - mynet
    ports:
      - 80:8080
    environment:
      - PGUSER=${PGUSER:-totoro}
      - PGPASSWORD=${PGPASSWORD:?database password not set}
      - PGHOST=${PGHOST:-db}
      - PGPORT=${PGPORT:-26257}
      - PGDATABASE=${PGDATABASE-mydb}
    deploy:
      restart_policy:
        condition: on-failure
  roach:
    image: cockroachdb/cockroach:latest-v20.1
    container_name: roach
    hostname: db
    networks:
      - mynet
    ports:
      - 26257:26257
      - 8080:8080
    volumes:
#      - type: volume
#        source: roach
#        target: /usr/data
      
      - roach:/usr/data
        
#     - "${PWD}/cockroach-data/roach:/usr/data"
    command: start-single-node --insecure

volumes:
  roach:


networks:
  mynet:
    driver: bridge

它仍然不起作用。 此外,它還創建了 2 個卷:“roach”和“WORKDIRNAME_roach”。 我實際上試圖將我的文件夾復制到這兩個。 它不工作。 構建命令的 output 總是這樣:

postgres-server   | STARTED AT
postgres-server   | Sep  4 10:43:10
postgres-server   | lstat /usr/data/assets/current_batch: no such file or directory
postgres-server   | 2022/09/04 10:43:10 lstat /usr/data/assets/current_batch: no such file or directory

(前 2 個字符串是我的 go.files 產生的,'assets' 是我要復制的文件夾)我認為我在錯誤的位置:也許我復制文件夾的方式不適用於這種構建?

更新:同時命令

docker run -it --rm -v roach:/data ubuntu ls /data/usr 

表明我的文件夾在那里。 但是容器處於一種不讓他看到它們的循環中。

米海想幫忙,但我不明白他的意思。 他實際上的意思是我必須增加我的應用服務的音量。 我現在做到了,它有效。 在下面的示例中,我為 db 和 app 命名了 2 個卷,只是為了提高准確性:

version: '3.8'

services:
  docker-parser:
    depends_on: 
      - roach
    build:
      context: .
    container_name: parser
    hostname: parser
    networks:
      - mynet
    ports:
      - 80:8080
    volumes:
      - assets:/data
    environment:
      - PGUSER=${PGUSER:-totoro}
      - PGPASSWORD=${PGPASSWORD:?database password not set}
      - PGHOST=${PGHOST:-db}
      - PGPORT=${PGPORT:-26257}
      - PGDATABASE=${PGDATABASE-mydb}
    deploy:
      restart_policy:
        condition: on-failure
  roach:
    image: cockroachdb/cockroach:latest-v20.1
    container_name: roach
    hostname: db
    networks:
      - mynet
    ports:
      - 26257:26257
      - 8080:8080
    volumes:
      - roach:/db
    command: start-single-node --insecure

volumes:
  assets:
  roach:

networks:
  mynet:
    driver: bridge

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM