我在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"]
1条答案
按热度按时间bihw5rsg1#
[How我可以]通过dockerfile访问我在docker compose中创建的卷吗?
不能。它还不存在。Composex 1 m0n1x块中的所有内容都发生在考虑Composes文件中的任何其他选项之前;您无法看到
volumes:
或environment:
变量,也无法访问networks:
上的其他容器(甚至无法访问自动提供的default
网络)。postgres
映像处理这一问题的方式是通过一个 * 入口点 Package 器脚本 *,如果数据库不存在,则该脚本会创建该数据库。将
java
命令替换为将数据文件从映像中的其他位置复制到卷中的任何调用;即使只是一个cp -r
也可以,只要源数据在data目录以外的地方。如果旧内容存在,您可以类似地更改逻辑以覆盖旧内容,或者如果您有某种方法可以合并新旧文件,您也可以这样做。在您的Dockerfile中,您可以将
CMD
保留原样,但请确保将COPY
脚本插入到您的映像中,并使其成为ENTRYPOINT
。ENTRYPOINT
行 * 必须 * 使用JSON数组语法(这意味着它不能包含环境变量引用;我已经在CMD
中纠正了这个问题)。脚本需要是可执行的(如果需要,在主机系统上运行chmod +x entrypoint.sh
)。(在Docker命名的卷周围有一种情况,有些问题会试图利用这种情况,但我通常不建议这样做。在您的示例中,
/opt/_LIB
容器目录使用绑定挂载的主机目录,因此这种技巧不起作用;如果您想要更改映像中的内容,或者您要部署到非本地Docker的环境,则该方法也不起作用。)