我的设置:文件夹结构
我的文件夹结构与您的类似:
├── docker-compose.yaml
├── project1
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── sub1
│ │ ├── testfile_project_1_1.txt
│ │ └── testfile_project_1_2.txt
│ └── sub2
│ └── testfile_project_1_3.txt
├── project2
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── sub1
│ │ └── testfile_project_2_1.txt
│ └── sub2
│ ├── testfile_project_2_2.txt
│ ├── testfile_project_2_3.txt
│ ├── testfile_project_2_4.txt
│ └── testfile_project_2_5.txt
└── project-db
├── Dockerfile
└── entrypoint.sh
来源
docker-compose.yaml
version: "3.8"
services:
first-service:
build:
context: ./project1
dockerfile: Dockerfile
volumes:
- data-first-service:/home/developer/
second-service:
build:
context: ./project2
dockerfile: Dockerfile
volumes:
- data-second-service:/home/developer/
databse-service:
build:
context: ./project-db
dockerfile: Dockerfile
volumes:
- data-first-service:/home/developer/project1/
- data-second-service:/home/developer/project2/
depends_on:
- first-service
- second-service
volumes:
data-first-service:
data-second-service:
Dockerfile(s)
它们基本上是相同的。*db-service* 的dockerfile只复制了它的入口脚本。有关sudoers
的部分在这里,因为这是我的默认测试镜像。我只是包含它以明确我的用户具有哪些权限,并使常规用户可以无密码使用sudo
。这不是强制性的。
FROM ubuntu:latest
RUN apt-get update && apt-get install -y sudo
RUN adduser developer
RUN \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; su - developer -c id
USER developer
COPY sub1 /home/developer/sub1
COPY sub2 /home/developer/sub2
RUN ls -l
ADD ./entrypoint.sh /entrypoint.sh
RUN sudo chmod +x /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]
entrypoint.sh
这两个项目的入口点并没有什么特别之处,它们只包含一个简单的ls -l
命令,用于查看/home/developer
目录。*db-service*的入口点只显示了一个tree
输出(见Results):
#!/bin/bash
cd ~
echo "db service - You are here: ${PWD} "
tree --du -shaC | grep -Ev '( *[^ ]* ){5}\['
结果
正如您所看到的,project-db
容器现在包含了另外两个项目的文件。
databse-service_1 | .
databse-service_1 | |-- [ 220] .bash_logout
databse-service_1 | |-- [3.7K] .bashrc
databse-service_1 | |-- [ 807] .profile
databse-service_1 | |-- [ 17K] project1
databse-service_1 | | |-- [ 220] .bash_logout
databse-service_1 | | |-- [3.7K] .bashrc
databse-service_1 | | |-- [ 807] .profile
databse-service_1 | | |-- [4.0K] sub1
databse-service_1 | | | |-- [ 0] testfile_project_1_1.txt
databse-service_1 | | | `-- [ 0] testfile_project_1_2.txt
databse-service_1 | | `-- [4.0K] sub2
databse-service_1 | | `-- [ 0] testfile_project_1_3.txt
databse-service_1 | `-- [ 17K] project2
databse-service_1 | |-- [ 220] .bash_logout
databse-service_1 | |-- [3.7K] .bashrc
databse-service_1 | |-- [ 807] .profile
databse-service_1 | |-- [4.0K] sub1
databse-service_1 | | `-- [ 0] testfile_project_2_1.txt
databse-service_1 | `-- [4.0K] sub2
databse-service_1 | |-- [ 0] testfile_project_2_2.txt
databse-service_1 | |-- [ 0] testfile_project_2_3.txt
databse-service_1 | |-- [ 0] testfile_project_2_4.txt
databse-service_1 | `-- [ 0] testfile_project_2_5.txt
databse-service_1 |
databse-service_1 | 42K used in 6 directories, 17 files
使用方法
正如所说的,这种方法有一些缺点。为了使这个解决方案生效,您需要运行 docker-compose down
命令。
因此,工作流程看起来类似于这样:
docker-compose build && docker-compose up
。
如果您更改了项目目录中的文件或者想要更新内容,必须调用 docker-compose down -v
命令,否则它仍将重复使用旧卷中预填充的内容。
解决方案2
基本上,它与解决方案1相同。不同之处在于,“项目容器”首先将源代码复制到临时位置,然后在容器启动(并挂载卷)后将其复制到卷挂载的路径。
Dockerfile
对于这个解决方案只有小的更改。
[...]
USER developer
COPY sub1 /tmp/sub1
COPY sub2 /tmp/sub2
RUN ls -l
ADD ./entrypoint.sh /entrypoint.sh
RUN sudo chmod +x /entrypoint.sh
ENTRYPOINT [ "/entrypoint.sh" ]
并且入口点看起来像这样
#!/bin/bash
mv /tmp/sub1 /home/developer/sub1
mv /tmp/sub2 /home/developer/sub1
COPY
到该卷中,然后与数据库共享卷。如果您需要,我可以提供更具体的答案。 - agentsmith