spring 如何通过dockerfile访问我在docker compose中创建的卷?

e5nqia27  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(136)

我在Docker compose中创建了一个卷,并希望将文件复制到其中。我需要Docker文件。但是,我不知道如何通过Docker文件访问我在Docker compose中创建的卷。我该如何做呢?
docker-compose.yml

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: test
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    ports:
      - "5433:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: test@gmail.com
      PGADMIN_DEFAULT_PASSWORD: test
    depends_on: 
      - postgres

  web:
    build:
      context: ../
      dockerfile: spring/Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    volumes:
      - ./test-volume:/opt/_LIB/

停靠文件

FROM ...

RUN rm -rf /var/lib/jetty/webapps/*
COPY spring/target/*.war /var/lib/jetty/webapps/

EXPOSE 8080

# CMD ["java", "-jar", "$JETTY_HOME/start.jar"]
bihw5rsg

bihw5rsg1#

[How我可以]通过dockerfile访问我在docker compose中创建的卷吗?
不能。它还不存在。Composex 1 m0n1x块中的所有内容都发生在考虑Composes文件中的任何其他选项之前;您无法看到volumes:environment:变量,也无法访问networks:上的其他容器(甚至无法访问自动提供的default网络)。
postgres映像处理这一问题的方式是通过一个 * 入口点 Package 器脚本 *,如果数据库不存在,则该脚本会创建该数据库。


# !/bin/sh

# entrypoint.sh

# If the data files don't exist yet, copy them in

if [ ! -f /opt/_LIB/data.txt ]; then
  java -cp "$JETTY_HOME/start.jar" com.example.tools.SeedData /opt/_LIB
fi

# Run the main container command

exec "$@"

java命令替换为将数据文件从映像中的其他位置复制到卷中的任何调用;即使只是一个cp -r也可以,只要源数据在data目录以外的地方。如果旧内容存在,您可以类似地更改逻辑以覆盖旧内容,或者如果您有某种方法可以合并新旧文件,您也可以这样做。
在您的Dockerfile中,您可以将CMD保留原样,但请确保将COPY脚本插入到您的映像中,并使其成为ENTRYPOINT

FROM ...

RUN rm -rf /var/lib/jetty/webapps/*
COPY spring/target/*.war /var/lib/jetty/webapps/
COPY entrypoint.sh /usr/local/bin                         # <-- ADD

EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]               # <-- ADD
CMD ["java", "-jar", "/var/lib/jetty/webapps/start.jar"]  # unmodified

ENTRYPOINT行 * 必须 * 使用JSON数组语法(这意味着它不能包含环境变量引用;我已经在CMD中纠正了这个问题)。脚本需要是可执行的(如果需要,在主机系统上运行chmod +x entrypoint.sh)。
(在Docker命名的卷周围有一种情况,有些问题会试图利用这种情况,但我通常不建议这样做。在您的示例中,/opt/_LIB容器目录使用绑定挂载的主机目录,因此这种技巧不起作用;如果您想要更改映像中的内容,或者您要部署到非本地Docker的环境,则该方法也不起作用。)

相关问题