我在设置docker镜像时遇到了一些问题,最终将在bitbucket管道上使用它来运行我正在处理的一些API项目的测试 .
我们的本地开发人员拥有的设置非常简单,在机器上运行Java 8 Maven PostgreSQL 9.6 .
要运行集成测试,必须运行DB . 部分maven构建在服务器上创建必要的数据库和表 .
我试图在docker图像上复制这个,这就是我到目前为止所拥有的 .
FROM maven:3.5.3-jdk-8-slim
#Install postgresql
RUN apt update && \
mkdir -p /usr/share/man/man1 &&\
mkdir -p /usr/share/man/man7 &&\
apt install -y postgresql-9.6
#Update config
RUN echo "host all all 127.0.0.1/32 trust" >> /etc/postgresql/9.6/main/pg_hba.conf
#Start server
RUN service postgresql start
#Create readonly role for DB
USER postgres
RUN psql -c "CREATE ROLE readonly"
如果我通过首次运行在容器内手动运行它们,这些步骤似乎正常工作:
docker run -it maven:3.5.3-jdk-8-slim /bin/bash
但是当我尝试构建图像时,这就是我得到的:
▶ docker build -t pipelines .
Sending build context to Docker daemon 2.048kB
Step 1/6 : FROM maven:3.5.3-jdk-8-slim
---> 25f97112c73f
Step 2/6 : RUN apt update && mkdir -p /usr/share/man/man1 && mkdir -p /usr/share/man/man7 && apt install -y postgresql-9.6
---> Using cache
---> 5fa381f73c9d
Step 3/6 : RUN echo "host all all 127.0.0.1/32 trust" >> /etc/postgresql/9.6/main/pg_hba.conf
---> Using cache
---> 0721966e7749
Step 4/6 : RUN service postgresql start
---> Using cache
---> 9ca8e7a270e0
Step 5/6 : USER postgres
---> Using cache
---> 50a99c6cac20
Step 6/6 : RUN psql -c "CREATE ROLE readonly"
---> Running in 572b2b8fa754
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
The command '/bin/sh -c psql -c "CREATE ROLE readonly"' returned a non-zero code: 2
我已经阅读了一些有关这意味着容器正在尝试访问主机上的端口而不是容器的东西 . 但我无法理解手动运行命令和让Dockerfile“运行”它们之间的区别 .
我也尝试从 postgres:9.6
基础映像构建它然后安装java maven但是当我需要在数据库上创建角色时,问题是一样的 .
鉴于我的意图是在bitbucket管道上使用这个,我在这里做错了 .
1 回答
在构建图像时使用
RUN
,例如安装postgress . 每个RUN
都在之前的RUN
指令之上构建了一个图层 .如果要在运行映像(创建容器)时默认执行命令,请使用
CMD
. 因此,当您在容器内运行该命令时,该容器将等同于Dockerfile中的CMD
.我建议使用一个脚本来运行你的命令
ENTRYPOINT
,create roles
,tables
,insert test data
...在Dockerfile中你通常有多个RUN
指令构建在最后一层之上,但CMD
overrides 之前的CMD
指令 .我也鼓励你阅读this回答解释RUN,CMD和ENTRYPOINT .
Summary
RUN
指令实际上在映像构建期间运行命令CMD
指令未执行 Build 时间,它在容器启动时执行 unless the user provides a command