我有以下 docker-compose 文件
version: '3.8'
services:
mariadb:
image: mariadb/server:10.5
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=${MARIADB_PASSWORD}
- MYSQL_ROOT_HOST=${MARIADB_GATEWAY}
networks:
network:
ipv4_address: ${MARIADB_IP}
my_service:
build:
context: .
dockerfile: Dockerfile_my_service
args:
DB_HOST: ${MARIADB_IP}
DB_USER: ${MARIADB_USER}
DB_PASSWORD: ${MARIADB_PASSWORD}
depends_on:
- mariadb
volumes:
my_service_vol:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: './../../my_service'
networks:
network:
driver: bridge
ipam:
config:
- subnet: ${MARIADB_SUBNET}
gateway: ${MARIADB_GATEWAY}
我的 .env 文件:
MARIADB_IP=10.5.0.5
MARIADB_SUBNET=10.5.0.0/16
MARIADB_GATEWAY=10.5.0.1
MARIADB_USER=root
MARIADB_PASSWORD=password
此外,这是 Dockerfile_my_service 文件:
FROM debian:11.6
ENV DEBIAN_FRONTEND=noninteractive
ARG DB_HOST
ARG DB_USER
ARG DB_PASSWORD
ENV DB_HOST=${DB_HOST}
ENV DB_USER=${DB_USER}
ENV DB_PASSWORD=${DB_PASSWORD}
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
RUN apt-get install -y \
systemd \
libmariadb3 \
dbconfig-common \
mariadb-server
ENV enable_db='service mariadb start'
RUN ${enable_db} && mariadb --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} -e "CREATE USER 'test'@'' IDENTIFIED BY 'test111';"
当我通过
docker-compose up -d my_service
运行 my_service 时,docker 将在此处停止:
Step 12/12 : RUN ${enable_db} && mariadb --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} -e "CREATE USER 'test'@'' IDENTIFIED BY 'test111';"
---> Running in f79da7cc8f30
Starting MariaDB database server: mariadbd.
并且不会做任何其他事情,有趣的是,如果我运行这个命令:
mariadb --host=10.5.0.5 --user=root --password=密码
在我的本地机器上,一切正常,我可以连接到我的数据库,但是当我从 my_service 容器内部进行连接时,无论我做什么都无法正常工作。
你们谁能帮我理解我做错了什么?
更新:
我还尝试通过在 my_service 中添加这部分来使我的两个容器都属于同一网络:
my_service:
build:
context: .
dockerfile: Dockerfile_my_service
args:
DB_HOST: ${MARIADB_IP}
DB_USER: ${MARIADB_USER}
DB_PASSWORD: ${MARIADB_PASSWORD}
depends_on:
- mariadb
networks:
network:
此外,我尝试过添加和不添加
ipv4_address: 10.5.0.6
对于 my_service,这些案例都没有用。
查看 docker networking。你需要建立一个网络,让两个容器都成为它的一部分。 这是一个example.