簡體   English   中英

從 dockerfile 訪問 docker-compose.yml 中設置的卷

[英]access volumes set in docker-compose.yml from dockerfile

我的項目架構是這樣的:

.
├── app/
├── context/
│   ├── Dockerfile
│   ├── .dockerignore
│   └── php.ini
├── database/
├── http/
├── composer.json
└── docker-compose.yml

docker-compose.yml我有以下配置:

version: '3.8'
services: 
  app:
    container_name: "ERP"
    restart: always
    build: 
      context: ./context
      dockerfile: Dockerfile
    stdin_open: true
    tty: true
    ports: 
      - '8000:80'
    links: 
      - db_server
    volumes:
      - .:/usr/src/app
    working_dir: /usr/src/app
  db_server:
    container_name: "db_server"
    image: 'mysql:8.0'
    ports: 
    - '3306:3306'

但是,當我設置Dockerfile內容以使用docker-compose up設置應用程序時,具有Dockerfile內容如下:

FROM ubuntu:20.04
WORKDIR /usr/src/app
RUN cat composer.json

它說"No such file or directory composer.json" 為什么?

更新

我設法根據ENTRYPOINT配置解決了這個問題..

據我了解 - 我是 docker 的新手 - ENTRYPOINT 定義了一個在容器開頭運行的入口腳本,因此,啟動該腳本肯定會在容器的運行時和 docker 指定的初始化之后 - compost.yml 文件.. 所以實際上下文的內容將可供腳本在運行時查看..

謝謝大家的答案。

那是因為你將上下文定義為“./context”,所以你被困在這個文件夾中,composer.json 不是。

利用 ”。” 為上下文。 dockerfile 的上下文/Dockerfile。 然后安裝“。” 將掛載整個目錄,而不僅僅是 ./context 一個。

創建映像的構建過程發生在獲取該映像並運行容器的運行時過程之前。 compose 文件包含一個構建部分,可讓您在運行之前輕松構建映像,但 compose 文件的所有其他部分都定義了運行時配置,例如卷安裝和網絡。

在構建時,您無需指定卷源,最多可以通過 VOLUME 步驟在映像中定義所需的卷目標。 (請注意,如果您這樣做,Dockerfile 中的未來 RUN 步驟可能會在修改該目錄時遇到問題,因為許多構建工具會按照您的要求安裝匿名卷,但僅捕獲對容器文件系統的更改,而不是對卷文件系統的更改)。

如果您需要映像中文件或目錄的內容,則必須在 Dockerfile 中執行 COPY 或 ADD 步驟,以從構建上下文(通常導入為.或當前目錄)復制到映像中。

build.context定義包含Dockerfile的目錄的路徑。 這是構建映像的上下文,在構建過程中 docker 無法訪問composer.json文件(它不在上下文中)。

命令RUN在構建期間運行命令。 如果你想在容器啟動時運行它,你應該使用CMD

FROM ubuntu:20.04
WORKDIR /usr/src/app
CMD cat composer.json

暫無
暫無

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

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