将Laravel的.env文件复制到Docker容器中

8

设置

我在我的Ubuntu服务器上运行Docker,尝试创建一个Laravel容器来使用artisan运行我的网站。 Laravel项目在GitHub存储库中,并使用dockerfile将项目克隆到docker容器中。

问题

Laravel项目依赖于不包含在repo项目中的.env(环境文件),出于安全原因。所以当我将repo克隆到docker容器时,它不包括.env文件,从而无法正常运行网站。我在我的Ubuntu本地拥有一个.env文件,正在尝试COPY到docker容器的Laravel项目文件夹中,但它当然不起作用,因为它正在寻找docker容器文件结构中的目录。

错误

Step 6/11 : COPY /containers/.env .env

lstat containers/.env: no such file or directory

问题

我该如何使用COPY命令将.env文件从Ubuntu服务器复制到Docker容器中?

文件结构(Ubuntu)源自:

root/
  containers/
    - docker-compose
    - .env

Docker容器的文件结构来源:

root/
  var/www/

dockerfile

FROM hitalos/laravel

RUN git config --system http.sslverify false

RUN git clone repo /var/www

RUN git checkout test

COPY /containers/.env .env

# Run Compser Install
RUN composer install -d /var/www
RUN php /var/www/artisan key:generate

WORKDIR /var/www

CMD php /var/www/artisan serve --port=80 --host=0.0.0.0
EXPOSE 80

为什么不在主机上检出repo,没有必要将repo放在镜像/容器中,你也可以复制它。 - bartimar
2个回答

9
简单地复制 .env 文件是不够的,因为您还需要在文件上运行“source”命令,然后运行“export”命令将每个环境变量添加到您的路径中。由于您使用了 docker-compose,则可以在 docker-compose.yml 中这样使用 env_file:
``` env_file: - .env ```
当构建容器时,这应该会自动从您的 .env 文件设置 Laravel 所需的值。

1
是的,我也认为复制.env文件不太对,感觉很脏!但如果你需要在构建阶段特别使用这些变量,你能帮忙吗?https://stackoverflow.com/questions/56459243/docker-compose-build-time-args-from-file(抱歉在旧问题上跟风):D - Pedro Costa

2

COPY命令中的路径是相对于Dockerfile文件的。

只需将其更改为COPY containers/.env /var/www/.env

编辑: 似乎您在构建时(镜像)没有.env文件,只有在运行时(容器)才有。这意味着在运行容器时必须挂载该文件。

从Dockerfile中删除COPY ...命令,改为使用以下命令运行容器:

-v /containers/.env:/var/www/.env

例如:

docker run... -v /containers/.env:/var/www/.env ...

或者在compose yml文件中进行更改。


1
仍然出现问题:lstat containers/.env: 没有那个文件或目录。 - melkawakibi
我认为我需要以某种方式远程访问Ubuntu服务器,以便访问目录容器。 - melkawakibi
等一下。你正在本地构建镜像,但是在 Ubuntu 服务器上运行容器,而你没有访问权限? - bartimar
如果你需要在运行时(容器)使用 .env 文件,但是在构建时(镜像)没有该文件,那么只需不使用任何 COPY 命令进行构建,并在运行时将卷简单地挂载到容器上 (docker run... -v /containers/.env:/var/www/.env ... )。 - bartimar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接